以非加密方式连接
使用Go驱动开发时,配置连接参数并生成连接串,再调用Golang中database/sql的sql.Open()接口创建一个新的SQL数据库连接对象,sql.Open()并不会立即建立数据库连接,实际建立连接是在第一次进行数据库操作(如查询或db.Ping())时才建立。可以通过调用Go sql的标准接口db.Ping()检查数据库连接是否能成功建连,并在有需要时建立连接(例如刚调用sql.Open()后,db.Ping()会触发首次连接尝试)。
sql.Open()函数原型
Go驱动提供了如下的方法用于创建一个数据库连接对象。
func Open(driverName, dataSourceName string) (*DB, error)
参数说明:
- driverName为驱动名称。数据库驱动的可选项有:
- “gaussdb”:连接GaussDB数据库时,需要传入驱动名称“gaussdb”。本章节示例,数据库驱动名称均使用“gaussdb”。
- 其他Go驱动名称,请参见Go驱动兼容。
- dataSourceName为连接字符串,支持DSN和URL两种:
- DSN格式:key1 = value1 key2 = value2 …,每组关键字间使用空格隔开,等号左右的空格是可选的。
- URL格式:driverName://[userspec@][hostspec][/dbname][?paramspec]。
其中,driverName为驱动名称,数据库的驱动名称使用“gaussdb”。
userspec表示user[:password],需要注意的是使用URL进行连接时,密码中不可包含URL串中的分隔符。如果密码中包含分隔符的话,建议采用DSN格式。另外,不允许使用初始化用户进行远程登录。
hostspec表示[host][:port][,…]。
dbname为数据库名称。
paramspec表示name=value[&…]。
- 在DSN格式中,对于多个IP地址的场景:
- 当num(ip) = num(port)时,ip和port是一一对应匹配。
- 当num(ip) > num(port)时,无法匹配到port的ip均与第一个port匹配。例如,host = ip1, ip2, ip3 port = port1, port2的匹配情况为ip1:port1, ip2:port2, ip3:port1。
- 当num(ip) < num(port)时,则多余的port被舍弃,即使用不到。例如host = ip1, ip2, ip3 port = port1, port2, port3, port4的匹配情况为ip1:port1, ip2:port2, ip3:port3。
- 在URL格式中,对于多个IP地址的场景:
- URL串中ip:port必须成对出现,即num(ip) = num(port),并以逗号隔开。例如, gaussdb://user:password@ip1:port1, ip2:port2, ip3:port3/gaussdb。
- URL串中仅包含多个IP地址,port由环境变量指定或采用默认值5432。例如gaussdb://user:password@ip1, ip2, ip3/gaussdb并设置环境变量PGPORT = "port1, port2",其匹配情况为ip1:port1, ip2:port2, ip3:port1。未设置环境变量的匹配情况为ip1:5432,ip2:5432,ip3:5432。
- 若输入IP地址为IPv6格式,则URL格式连接串中需在IP两边增加'[]',例如:gaussdb://user:password@[ip1]:port1, [ip2]:port2, [ip3]:port3/gaussdb。
db.Ping()函数原型
Golang的database/sql中提供了DB对象绑定的接口Ping,测试连接数据库对象创建后是否连接成功,以下为接口定义。
func (db *DB) Ping() error
用户可以使用db.Ping()函数测试是否成功连接数据库,通过以下代码可以更清楚了解如何使用db.Ping()函数。
err = db.Ping()
if err != nil {
log.Fatal("连接失败:", err)
return
}
log.Println("成功连接到数据库") 当err为nil时表示成功建连且没有报错信息,上述代码则会输出"成功连接到数据库"。err不为nil表示建立数据库连接失败,并接收错误信息,用户可以通过log.Fatal输出错误信息err。例如,建立数据库连接失败时, db.Ping()返回错误信息“connection refused”,此时err接收该错误信息,调用log.Fatal("连接失败:", err)则会输出“连接失败:connection refused”。
方式一
通过DSN/URL连接串配置连接参数。例如,用户自行设置IP地址、端口号、用户名和密码对应的[GOXX]环境变量,并在业务代码中通过os.Getenv()方法获取对应变量值进行DSN/URL连接串的拼接,步骤如下:
- 设置连接串拼接所需的环境变量。
export GOHOSTIP="XXX.XXX.XXX.XXX" export GOPORT=XXX export GOUSRNAME="XXX" export GOPASSWD="XXXXXXX"
- 引用Go驱动模块以及其他依赖标准库。
package main //依赖包根据环境中依赖包路径设置。 import ( "database/sql" _ [go驱动模块名] //请根据go驱动实际模块名替换。 "os" "log" )
- database/sql:Golang标准库,提供通用的数据库操作接口,定义与数据库交互的核心方法(如 Query(), Exec(), Prepare() 等)。
- _ "[go驱动模块名]":Go驱动模块。
- os:Golang标准库,提供与操作系统交互的功能(文件操作、环境变量)。本示例中os包用于从环境变量获取参数值,驱动不依赖此包。
- log:Golang标准库,提供日志记录功能,常用于输出错误信息或调试日志。本示例中log包用于打印日志,驱动不依赖此包。
- 调用os.Getenv()方法从环境变量获取IP地址、端口号、用户名、密码。
hostip := os.Getenv("GOHOSTIP") port := os.Getenv("GOPORT") usrname := os.Getenv("GOUSRNAME") passwd := os.Getenv("GOPASSWD") - 采用DSN格式或URL格式定义连接字符串,调用sql.Open() 函数创建数据库连接对象。
str := "host=" + hostip + " port=" + port + " user=" + usrname + " password=" + passwd + " dbname=gaussdb sslmode=disable" //DSN连接串。用户需要自行设置dbname和sslmode关键字的取值。 // str := "gaussdb://" + usrname + ":" + passwd + "@" + hostip + ":" + port + "/gaussdb?sslmode=disable" //URL连接串。用户需要自行设置数据库名称和sslmode的取值。 db, err := sql.Open("gaussdb", str) //创建数据库连接对象,但不会立即建立数据库连接。 if err != nil { log.Fatal(err) //执行报错时,使用log.Fatal方法输出错误信息。 } - 调用db.Ping()验证数据库建连是否成功。
err = db.Ping() if err != nil { log.Fatal(err) //err不为nil表明连接失败,则会执行log.Fatal输出连接失败的原因。 }
步骤2-步骤5为示例中的业务代码。
方式二
部分连接参数通过环境变量[PGXX]设置参数值,并且这部分参数在DSN/URL连接串中不进行配置。例如DSN/URL连接串配置用户名和密码,通过环境变量PGHOST、PGPORT、PGDATABASE、PGXX分别指定IP地址、端口号、数据库名、其他参数,步骤如下:
- 设置环境变量。
export PGHOST="XXX.XXX.XXX.XXX" export PGPORT=XXX export PGDATABASE="XXX" export PGSSLMODE="disable" export GOUSRNAME="XXX" export GOPASSWD="XXXXXXX"
- 引用Go驱动模块以及其他依赖标准库。
package main //依赖包根据环境中依赖包路径设置。 import ( "database/sql" _ [go驱动模块名] //请根据go驱动实际模块名替换。 "os" "log" )
- database/sql:Golang标准库,提供通用的数据库操作接口,定义与数据库交互的核心方法(如 Query(), Exec(), Prepare() 等)。
- _ "[go驱动模块名]":Go驱动模块,通过此步骤将Go驱动模块指向本地Go驱动目录。
- os:Golang标准库,提供与操作系统交互的功能(文件操作、环境变量)。本用例中os包用于从环境变量获取参数值,驱动不依赖此包。
- log:Golang标准库,提供日志记录功能,常用于输出错误信息或调试日志。本用例中log包用于打印日志,驱动不依赖此包。
- 调用os.Getenv()方法获取用户名、密码。
usrname := os.Getenv("GOUSRNAME") passwd := os.Getenv("GOPASSWD") - 采用DSN格式或URL格式定义连接字符串,并调用sql.Open() 函数创建数据库连接对象。
str := " user=" + usrname + " password=" + passwd //DSN连接串。 // str := "gaussdb://" + usrname + ":" + passwd //URL连接串。 db, err := sql.Open("gaussdb", str) //创建数据库连接对象,但不会立即建立数据库连接。 if err != nil { log.Fatal(err) //执行报错时,使用log.Fatal方法输出错误信息。 } - 调用db.Ping()验证数据库建连是否成功。
err = db.Ping() if err != nil { log.Fatal(err) //err不为nil表明连接失败,则会执行log.Fatal输出连接失败的原因。 }
步骤2-步骤5为示例中的业务代码。