基于Go database/sql接口的應(yīng)用開發(fā)
本文介紹通過Go語言的database/sql包使用SQL開發(fā)Lindorm寬表應(yīng)用的方法和示例。
前提條件
已下載并安裝Go環(huán)境,建議安裝Go 1.17及以上版本。
已將客戶端IP地址添加至Lindorm實(shí)例的白名單中,具體操作,請(qǐng)參見設(shè)置白名單。
使用限制
本文操作僅適用于Lindorm寬表模式,不支持Lindorm寬表Serverless模式。
操作步驟
在Go項(xiàng)目程序的go.mod文件中添加以下依賴:
require github.com/apache/calcite-avatica-go/v5 v5.0.0 replace github.com/apache/calcite-avatica-go/v5 => github.com/aliyun/alibabacloud-lindorm-go-sql-driver/v5 v5.0.6
在
.go
文件中添加數(shù)據(jù)庫驅(qū)動(dòng)的依賴,內(nèi)容如下:import ( avatica "github.com/apache/calcite-avatica-go/v5" )
在
.go
文件的main方法中初始化連接池并配置以下參數(shù),示例如下:databaseUrl := "http://localhost:30060" conn := avatica.NewConnector(databaseUrl).(*avatica.Connector) conn.Info = map[string]string{ "user": "sql", "password": "test", "database": "default", } db := sql.OpenDB(conn) // 設(shè)置連接池參數(shù) db.SetConnMaxIdleTime(8 * time.Minute) db.SetMaxOpenConns(20) db.SetMaxIdleConns(2)
參數(shù)說明如下:
參數(shù)
是否必選
說明
databaseUrl
是
Lindorm寬表SQL地址,例如:
http://ld-bp12pc23yfb38****-proxy-lindorm.lindorm.rds.aliyuncs.com:30060
。查看方法請(qǐng)參見查看寬表引擎連接地址。user
是
訪問寬表引擎的用戶名。
password
是
訪問寬表引擎的密碼,如果您忘記了密碼,可以通過Lindorm寬表引擎的集群管理系統(tǒng)修改密碼,具體請(qǐng)參見修改用戶密碼。
database
是
數(shù)據(jù)庫名。
SetConnMaxIdleTime
否
設(shè)置最大空閑時(shí)間。默認(rèn)值為0,表示不超時(shí)。
SetMaxOpenConns
否
設(shè)置連接池中允許的最大連接數(shù)。默認(rèn)值為0,表示沒有限制。
SetMaxIdleConns
否
設(shè)置連接池中允許的最大空閑連接數(shù)。默認(rèn)值為2。
在寬表引擎中進(jìn)行創(chuàng)建表、寫入數(shù)據(jù)、查詢數(shù)據(jù)、刪除數(shù)據(jù)操作,示例如下:
創(chuàng)建表
_, 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 }
寫入數(shù)據(jù)
方法一:直接寫入數(shù)據(jù)。
_, err = db.Exec("upsert into user_test(id,name,age) values(1,'zhangsan',17)") if err != nil { fmt.Println("insert data error", err) return }
方法二:通過綁定參數(shù)的方式進(jìn)行寫入數(shù)據(jù)。
stmt, err := db.Prepare("upsert into user_test(id,name,age) values(?,?,?)") if err != nil { fmt.Println("prepare error", err) return } _, err = stmt.Exec(1, "zhangsan", 17) if err != nil { fmt.Println("upsert error", err) return }
查詢數(shù)據(jù)
方法一:直接查詢數(shù)據(jù)。
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) }
方法二:通過綁定參數(shù)的方式執(zhí)行參數(shù)化查詢。
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) }
刪除數(shù)據(jù)
_, err = db.Exec("delete from user_test where id=1") if err != nil { fmt.Println("delete data error", err) return }
說明在業(yè)務(wù)應(yīng)用的實(shí)現(xiàn)中,對(duì)于寫入或查詢語句相對(duì)固化的場(chǎng)景,推薦使用上述綁定參數(shù)的方式,使用Prepare之后的stmt對(duì)象執(zhí)行寫入或查詢。因?yàn)檫@種方式對(duì)于相同的語句只會(huì)執(zhí)行一次SQL的解析、改寫、優(yōu)化邏輯,有助于提升執(zhí)行性能。
完整的示例代碼請(qǐng)參見代碼示例和通過綁定參數(shù)寫入和查詢數(shù)據(jù)。