连接介绍
使用Go驱动开发时,配置连接参数并生成连接串,再调用Golang中database/sql包的sql.Open()接口创建SQL数据库连接对象。sql.Open()不会立即建立数据库连接,实际连接在首次进行数据库操作(如查询或db.Ping())时建立。可通过Golang中database/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”。