全部產品
Search
文件中心

:Golang

更新時間:Jul 06, 2024

本文介紹如何使用Golang串連AnalyticDB MySQL版

前提條件

  • 已安裝了Git,並且已將Git路徑添加到Path環境變數中。
  • 下載並安裝Golang
  • 安裝Golang MySQL Driver。
    1. 下載 Golang MySQL Driver
    2. 使用Shell中的go工具將驅動包安裝到$GOPATH中。
      go get github.com/go-sql-driver/mysql

串連AnalyticDB MySQL版

package main
import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)
const (
   //user是AnalyticDB MySQL版叢集中的使用者帳號:高許可權帳號或者普通帳號。
    user = "adb_test"
    //password是AnalyticDB MySQL版叢集中使用者帳號對應的密碼。
    password = "xxx"
    //host是AnalyticDB MySQL版叢集的串連地址,可以在控制台的叢集資訊頁面擷取串連地址。
    host = "127.0.xx.xx"
    //3306是連接埠號碼。
    port = 3306
    //database是AnalyticDB MySQL版叢集中的資料庫名稱。
    database = "database_name"
    //資料庫連接的逾時時間。
    connectTimeout = "10s"
)
func main() {
    //開啟資料庫連接。
    url := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?timeout=%s", user, password, host, port, database, connectTimeout)
    db, err := sql.Open("mysql", url)
    if err != nil {
        panic(err.Error())
    }
    //設定可開啟串連數的最大值,預設值為0,表示不限制。
    db.SetMaxOpenConns(2)
    //設定最大閑置串連數。
    db.SetMaxIdleConns(1)
    // 設定串連的最大生命週期,預設串連總是可重用。
    // 該設定無法保證串連在串連池中完整存在一小時。
    // 該設定項不是空閑逾時時間,即串連會在第一次建立後一小時到期。
    // 理論上,串連的最大生命週期越短,從0開始建立串連的頻率就會越高。
    db.SetConnMaxLifetime(time.Hour)
    // defer the close till after the main function has finished
    // executing
    defer db.Close()
    rows, err := db.Query("show tables")
    if err != nil {
        panic(err.Error())
    }
    for rows.Next() {
        var tableName string
        err := rows.Scan(&tableName)
        if err != nil {
            panic(err.Error())
        }
        fmt.Println(tableName)
    }
}

開啟服務端的Prepared Statement

package main
import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "time"
)
const (
   //user是AnalyticDB MySQL版叢集中的使用者帳號:高許可權帳號或者普通帳號。
    user = "adb_test"
    //password是AnalyticDB MySQL版叢集中使用者帳號對應的密碼。
    password = "xxx"
    //host是AnalyticDB MySQL版叢集的串連地址,可以在控制台的叢集資訊頁面擷取串連地址。
    host = "127.0.xx.xx"
    //3306是連接埠號碼。
    port = 3306
    //database是AnalyticDB MySQL版叢集中的資料庫名稱。
    database = "database_name"
    //資料庫連接的逾時時間。
    connectTimeout = "10s"
)
func main() {
    // open the database connection
    url := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?timeout=%s", user, password, host, port, database, connectTimeout)
    db, err := sql.Open("mysql", url)
    if err != nil {
        panic(err.Error())
    }
    // 設定最大開啟的串連數,預設值為0,表示不限制。
    db.SetMaxOpenConns(2)
    // 設定最大閑置的串連數
    db.SetMaxIdleConns(1)
    // 設定串連的最大生命週期,預設串連總是可重用。
    // 該設定無法保證串連在串連池中完整存在一小時。串連可能會因為某些原因無法使用而自動關閉。
    // 該設定項不是空閑逾時時間,即串連會在第一次建立後一小時到期,而不是空閑後一小時到期。
    // 理論上,串連的最大生命週期越短,從0開始建立串連的頻率就會越高。
    db.SetConnMaxLifetime(time.Hour)
    defer db.Close()
    stmt, err := db.Prepare("select * from student where id = ?")
    if err != nil {
        panic(err.Error())
    }
    defer stmt.Close()
    rows, err := stmt.Query(9)
    if err != nil {
        panic(err.Error())
    }
    defer rows.Close()
    for rows.Next() {
        var id string
        var name string
        var unit string
        err := rows.Scan(&id, &name, &unit)
        if err != nil {
            panic(err.Error())
        }
        fmt.Println(fmt.Sprintf("%s, %s, %s", id, name, unit))
    }
}

開啟用戶端的PrepareStatement

在Go MySQL Driver中開啟PrepareStatement時,需要配置參數interpolateParams=true開啟用戶端的PrepareStatement,如下所示。
重要 db.Prepare和stmt.Query無法感知參數interpolateParams=true,必須使用db.Query才可開啟用戶端的PrepareStatement。
package main
import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "time"
)
const (
    //user是AnalyticDB MySQL版叢集中的使用者帳號:高許可權帳號或者普通帳號。
    user = "adb_test"
    //password是AnalyticDB MySQL版叢集中使用者帳號對應的密碼。
    password = "xxx"
    //host是AnalyticDB MySQL版叢集的串連地址,可以在控制台的叢集資訊頁面擷取串連地址。
    host = "127.0.xx.xx"
    //3306是連接埠號碼。
    port = 3306
    //database是AnalyticDB MySQL版叢集中的資料庫名稱。
    database = "database_name"
    //資料庫連接的逾時時間。
    connectTimeout = "10s"
)
func main() {
    //開啟資料庫連接。
    url := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?timeout=%s&interpolateParams=true", user, password, host, port, database, connectTimeout)
    db, err := sql.Open("mysql", url)
    if err != nil {
        panic(err.Error())
    }
    //設定最大開啟的串連數,預設值為0,表示不限制。
    db.SetMaxOpenConns(2)
    //設定最大閑置的串連數。
    db.SetMaxIdleConns(1)
    //設定串連的最大生命週期,預設是串連總是可重用。
    //該設定無法保證串連在串連池中完整存在一小時。串連可能會因為某些原因無法使用而自動關閉。
    //該設定項不是空閑逾時時間,即串連會在第一次建立後一小時到期,而不是空閑後一小時到期。
    //理論上,串連的最大生命週期越短,從0開始建立串連的頻率就會越高。
    db.SetConnMaxLifetime(time.Hour)
    defer db.Close()
    rows, err := db.Query("select * from student where id = ?", 9)
    if err != nil {
        panic(err.Error())
    }
    defer rows.Close()
    for rows.Next() {
        var id string
        var name string
        var unit string
        err := rows.Scan(&id, &name, &unit)
        if err != nil {
            panic(err.Error())
        }
        fmt.Println(fmt.Sprintf("%s, %s, %s", id, name, unit))
    }
}