
# 通过Python、C或Golang连接RDS for MySQL实例
本文介绍如何通过Python、C或Golang连接RDS for MySQL实例。
#### 代码中的参数说明
表1参数说明 
| 参数               | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|:---|:---|
| \<RDS_HOST\>     | 实例的连接地址。 获取方法如下： - 通过内网连接实例：单击实例名称，在实例的"连接管理"页面获取实例的"内网地址"。  - 通过公网连接实例：单击实例名称，在实例的"连接管理"页面获取实例绑定的"弹性公网IP"。   |
| \<RDS_PORT\>     | 实例的数据库端口。 获取方法如下： 1. 单击实例名称，进入"概览"页面。  2. 在左侧导航栏，单击"连接管理"，查看数据库端口。                        |
| \<RDS_USER\>     | 实例的账号名称，默认root。 获取方法如下： 1. 单击实例名称，进入"概览"页面。  2. 在左侧导航栏，单击"数据库与账号管理"，在"账号管理"页签下查看账号名称。                                                                                                                                                                      |
| \<RDS_PASSWORD\> | 实例的账号所对应的密码。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| \<RDS_DATABASE\> | 连接的实例的数据库名称。 获取方法如下： 1. 单击实例名称，进入"概览"页面。  2. 在左侧导航栏，单击"数据库与账号管理"，在"数据库管理"页签下查看数据库名称。                                                                                                                                                                                                                                          |
   
- [Python示例代码]
  在运行代码前，请先安装PyMySQL。
  - Python3安装命令：
    ```
    pip3 install PyMySQL
    ```
    
  
  - Python2安装命令：
    ```
    pip install pymysql==0.9.3
    ```
    
  
  
  Python3示例代码如下：
  ```
  import pymysql  
  connection = pymysql.connect(host='<RDS_HOST>',
                                port=<RDS_PORT>,
                               user='<RDS_USER>',
                           password='<RDS_PASSWORD>',
                           database='<RDS_DATABASE>')  
  try:
       with connection.cursor() as cursor:
           sql = "SELECT * FROM `courses`"
           cursor.execute(sql)
           for result in cursor:
                print(result) 
  finally:
       connection.close()
  ```
- [C示例代码]
  在运行代码前，请先安装mysql.h头文件，以CentOS为例，执行如下命令：
  ```
  sudo yum install mysql-devel
  ```
  示例代码如下：
  ```
  #include <stdio.h>
  #include <mysql.h>
  #include <string.h>
   
  int main(void){
      MYSQL *t_mysql;
      MYSQL_RES *res = NULL;
      MYSQL_ROW row;
      int i, fields;
      char select[] = "select * from courses";
   
      t_mysql = mysql_init(NULL);
      if(NULL == t_mysql){
          printf("init failed\n");
          return -1;
      }
   
      if(NULL == mysql_real_connect(t_mysql,
          "<RDS_HOST>",
          "<RDS_USER>",
          "<RDS_PASSWORD>",
          "<RDS_DATABASE>",
          3306,
          NULL, 0)){
          printf("connect failed: %s\n", mysql_error(t_mysql));
          mysql_close(t_mysql);
          return -1;
      }
   
      if(mysql_real_query(t_mysql, select, strlen(select)) != 0){
          printf("select failed: %s\n", mysql_error(t_mysql));
          mysql_close(t_mysql);
          return -1;
      }
   
      res = mysql_store_result(t_mysql);
      if(NULL == res){
          printf("mysql_store_result(): %s\n", mysql_error(t_mysql));
          mysql_close(t_mysql);
          return -1;
      }
   
      fields = mysql_num_fields(res);
      while((row = mysql_fetch_row(res))){
          for(i = 0; i < fields; i++){
              printf("%s\t", row[i]);
          }
          printf("\n");
      }
   
      mysql_free_result(res);
      mysql_close(t_mysql);
      return 0;
  }
  ```
- [Golang示例代码]
  在运行代码前，请先安装MySQL驱动：
  ```
  go get -u github.com/go-sql-driver/mysql
  ```
  示例代码如下：
  ```
  package main
   
  import (
      "database/sql"
      "fmt"
      "log"
      "os"
      "time"
      _ "github.com/go-sql-driver/mysql"
  )
   
  func getDB() (*sql.DB, error) {
      host := os.Getenv("RDS_HOST")
      port := os.Getenv("RDS_PORT")
      user := os.Getenv("RDS_USER")
      password := os.Getenv("RDS_PASSWORD")
      database := os.Getenv("RDS_DATABASE")
   
      if host == "" || user == "" || password == "" {
          return nil, fmt.Errorf("缺少必要的数据库连接参数")
      }
   
      if port == "" {
          port = "3306"
      }
   
      dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
          user, password, host, port, database)
   
      db, err := sql.Open("mysql", dsn)
      if err != nil {
          return nil, err
      }
   
      db.SetMaxOpenConns(20)
      db.SetMaxIdleConns(10)
      db.SetConnMaxLifetime(30 * time.Minute)
   
      return db, nil
  }
   
  func main() {
      db, err := getDB()
      if err != nil {
          log.Fatal("数据库连接失败:", err)
      }
      defer db.Close()
   
      // 验证连接
      if err := db.Ping(); err != nil {
          log.Fatal("数据库Ping失败:", err)
      }
      fmt.Println("数据库连接成功")
  }
  ```
