本文介紹使用Go語言的database/sql包和SQL語句在Lindorm寬表應用中進行開發的方法和樣本。
前提條件
已安裝GO環境,建議安裝Go 1.17及以上版本。如何安裝,請參見Go。
已開通MySQL協議相容功能。如何開通,請參見開通MySQL協議相容功能。
已將用戶端IP添加至白名單,具體操作請參見設定白名單。
操作步驟
在Go專案的
go.mod
檔案中,添加Golang MySQL Driver依賴。require github.com/go-sql-driver/mysql v1.7.1
配置串連參數。
const ( user = "user" password = "test" host = "ld-uf6k8yqb741t3****-proxy-sql-lindorm.lindorm.rds.aliyuncs.com" port = 33060 database = "default" connectTimeout = "10s" )
參數說明
參數
說明
user
如果您忘記使用者密碼,可以通過Lindorm寬表引擎的叢集管理系統修改密碼。具體操作,請參見修改使用者密碼。
password
host
Lindorm寬表引擎的MySQL相容地址。如何擷取,請參見查看串連地址。
重要如果應用部署在ECS執行個體,建議您通過專用網路訪問Lindorm執行個體,可獲得更高的安全性和更低的網路延遲。
如果應用部署在本地,在通過公網串連Lindorm執行個體前,需在控制台開通公網地址。開通方式:在控制台選擇
,在寬表引擎頁簽單擊開通公網地址。通過專用網路訪問Lindorm執行個體,host請填寫MySQL相容地址對應的專用網路地址。通過公網訪問Lindorm執行個體,host請填寫MySQL相容地址對應的公網地址。
port
Lindorm寬表引擎MySQL協議的連接埠,固定為33060。
database
需要串連的資料庫名稱。預設串連default資料庫。
connectTimeout
資料庫連接的逾時時間。單位為秒(s)。
建立串連,通過寬表SQL文法使用Lindorm寬表引擎。以查詢所有資料庫為例。
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(20) //設定最大閑置串連數, 預設值為2。 db.SetMaxIdleConns(20) // 設定串連的最大空閑時間,預設值為0,表示不逾時。 db.SetConnMaxIdleTime(8 * time.Minute) defer db.Close() // 擷取資料庫中所有的database { rows, err := db.Query("show databases") if err != nil { panic(err.Error()) } for rows.Next() { var dbName string err := rows.Scan(&dbName) if err != nil { panic(err.Error()) } fmt.Println(dbName) } }
完整樣本
完整範例程式碼如下:
package main
import (
"database/sql"
"fmt"
"time"
_ "github.com/go-sql-driver/mysql"
)
const (
//user為Lindorm寬表引擎的使用者名稱
user = "user"
//password為Lindorm寬表引擎的密碼
password = "test"
//host為Lindorm寬表引擎的MySQL相容地址
host = "ld-uf6k8yqb741t3****-proxy-sql-lindorm-public.lindorm.rds.aliyuncs.com"
//Lindorm寬表引擎MySQL協議的連接埠,固定為33060
port = 33060
//database為需要串連的資料庫名稱
database = "default"
//資料庫連接的逾時時間
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(20)
//設定最大閑置串連數, 預設值為2
db.SetMaxIdleConns(20)
//設定串連的最大空閑時間,預設值為0,表示不逾時
db.SetConnMaxIdleTime(8 * time.Minute)
defer db.Close()
//擷取資料庫中所有的database
{
rows, err := db.Query("show databases")
if err != nil {
panic(err.Error())
}
for rows.Next() {
var dbName string
err := rows.Scan(&dbName)
if err != nil {
panic(err.Error())
}
fmt.Println(dbName)
}
}
//建立表
{
_, err := db.Exec("create table if not exists user_test(id int, name varchar,age int, primary key(id))")
if err != nil {
fmt.Println("create table error ", err)
return
}
}
//寫入資料
//寫入方法一:直接寫入資料。
{
_, err = db.Exec("upsert into user_test(id,name,age) values(1,'zhangsan',17)")
if err != nil {
fmt.Println("insert data error", err)
return
}
}
//寫入方法二:通過綁定參數的方式進行寫入資料。
{
stmt, err := db.Prepare("upsert into user_test(id,name,age) values(?,?,?)")
if err != nil {
fmt.Println("prepare error", err)
return
}
_, err = stmt.Exec(2, "lisi", 18)
if err != nil {
fmt.Println("upsert error", err)
return
}
}
//查詢資料
//查詢方法一:直接查詢資料。
{
rows, err := db.Query("select * from user_test")
if err != nil {
fmt.Println("query data error", err)
return
}
defer rows.Close()
var id int
var name string
var age int
for rows.Next() {
err = rows.Scan(&id, &name, &age)
if err != nil {
fmt.Println("scan data error", err)
return
}
fmt.Println("id:", id, "name:", name, "age:", age)
}
}
// 查詢方法二:通過綁定參數的方式執行參數化查詢。
{
stmt, err := db.Prepare("select * from user_test where id=?")
if err != nil {
fmt.Println("prepare error", err)
return
}
rows, err := stmt.Query(1)
if err != nil {
fmt.Println("query data error", err)
return
}
defer rows.Close()
var id int
var name string
var age int
for rows.Next() {
err = rows.Scan(&id, &name, &age)
if err != nil {
fmt.Println("scan data error", err)
return
}
fmt.Println("id:", id, "name:", name, "age:", age)
}
}
//刪除資料
{
_, err = db.Exec("delete from user_test where id=1")
if err != nil {
fmt.Println("delete data error", err)
return
}
}
}
如果當前執行個體僅有default一個資料庫,執行成功後將返回如下結果:
default
information_schema
id: 1 name: zhangsan age: 17
id: 2 name: lisi age: 18