全部产品
云市场
云游戏

Golang访问

更新时间:2020-03-06 16:01:38

本文介绍如何使用Golang连接AnalyticDB for MySQL 2.0。

前提条件

  • 下载并安装Golang,详情请参见Golang

  • 安装Golang MySQL Driver。

    1. 下载 Golang MySQL Driver

    2. 使用Shell中的go工具将驱动包安装到$GOPATH中。

      1. go get github.com/go-sql-driver/mysql

      要求在您的主机和系统的PATH中安装了Git。

连接AnalyticDB for MySQL 2.0

  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. _ "github.com/go-sql-driver/mysql"
  6. )
  7. const (
  8. user = "xxx"
  9. password = "xxx"
  10. host = "127.0.0.1"
  11. port = 3306
  12. database = "xxx"
  13. // 数据库连接的超时时间
  14. connectTimeout = "10s"
  15. )
  16. func main() {
  17. // 打开数据库连接
  18. //user为AnalyticDB for MySQL 2.0集群的用户账号,通常为阿里云AK的AccessKey ID。
  19. //password为AnalyticDB for MySQL 2.0集群的用户密码,通常为阿里云AK的 Access Key Secret。
  20. //host为AnalyticDB for MySQL 2.0集群的访问URL的域名或IP。
  21. //port为AnalyticDB for MySQL 2.0集群的访问URL端口。
  22. //database为AnalyticDB for MySQL 2.0集群的名称。
  23. url := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?timeout=%s", user, password, host, port, database, connectTimeout)
  24. db, err := sql.Open("mysql", url)
  25. if err != nil {
  26. panic(err.Error())
  27. }
  28. // 设置最大打开的连接数,默认值为0,表示不限制。
  29. db.SetMaxOpenConns(2)
  30. // 设置最大闲置的连接数。
  31. db.SetMaxIdleConns(1)
  32. // 设置连接的最大生命周期,默认连接总是可重用。
  33. // 不能保证连接将在连接池中存在完整的1小时,很可能由于某种原因连接将变得不可用,并且在此之前自动关闭。
  34. // 这不是空闲超时。连接将在第1次创建后1小时后过期,而不是1小时后变成空闲。
  35. // 理论上,ConnMaxLifetime越短,从0开始创建连接的频率就越高。
  36. db.SetConnMaxLifetime(time.Hour)
  37. // defer the close till after the main function has finished
  38. // executing
  39. defer db.Close()
  40. rows, err := db.Query("show tables")
  41. if err != nil {
  42. panic(err.Error())
  43. }
  44. for rows.Next() {
  45. var tableName string
  46. err := rows.Scan(&tableName)
  47. if err != nil {
  48. panic(err.Error())
  49. }
  50. fmt.Println(tableName)
  51. }
  52. }

开启客户端的PrepareStatement

目前AnalyticDB for MySQL 2.0不支持服务端预编译,只支持在客户端使用Prepared Statement。

在Go MySQL driver中开启PrepareStatement时,需要配置interpolateParams=true参数,如下所示。

  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. _ "github.com/go-sql-driver/mysql"
  6. "time"
  7. )
  8. const (
  9. user = "xxx"
  10. password = "xxx"
  11. host = "127.0.0.1"
  12. port = 3306
  13. database = "xxx"
  14. // 数据库连接的超时时间。
  15. connectTimeout = "10s"
  16. )
  17. func main() {
  18. // open the database connection
  19. url := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?timeout=%s&interpolateParams=true", user, password, host, port, database, connectTimeout)
  20. db, err := sql.Open("mysql", url)
  21. if err != nil {
  22. panic(err.Error())
  23. }
  24. // 设置最大打开的连接数,默认值为0,表示不限制。
  25. db.SetMaxOpenConns(2)
  26. // 设置最大闲置的连接数。
  27. db.SetMaxIdleConns(1)
  28. // 设置连接的最大生命周期,默认连接总是可重用。
  29. // 不能保证连接将在池中存在完整的1小时,很可能由于某种原因连接将变得不可用,并且在此之前自动关闭。
  30. // 这不是空闲超时。连接将在第1次创建后1小时后过期,而不是1小时后变成空闲。
  31. // 理论上,ConnMaxLifetime越短,从0开始创建连接的频率就越高。
  32. db.SetConnMaxLifetime(time.Hour)
  33. defer db.Close()
  34. rows, err := db.Query("select * from student where student_id = ?", 1)
  35. if err != nil {
  36. panic(err.Error())
  37. }
  38. defer rows.Close()
  39. for rows.Next() {
  40. var schoolId string
  41. var studentId string
  42. var studentName string
  43. err := rows.Scan(&schoolId, &studentId, &studentName)
  44. if err != nil {
  45. panic(err.Error())
  46. }
  47. fmt.Println(fmt.Sprintf("%s, %s, %s", schoolId, studentId, studentName))
  48. }
  49. }