更新时间:2026-07-28 GMT+08:00
分享

以非加密方式连接

使用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连接串的拼接,步骤如下:

  1. 设置连接串拼接所需的环境变量。

    export GOHOSTIP="XXX.XXX.XXX.XXX"
    export GOPORT=XXX
    export GOUSRNAME="XXX"
    export GOPASSWD="XXXXXXX"

  2. 引用Go驱动模块以及其他依赖标准库。

    package main
    //依赖包根据环境中依赖包路径设置。
    import (
       "database/sql"
       _ [go驱动模块名] //请根据go驱动实际模块名替换。
       "os"
       "log"
    )
    • database/sql:Golang标准库,提供通用的数据库操作接口,定义与数据库交互的核心方法(如 Query(), Exec(), Prepare() 等)。
    • _ "[go驱动模块名]":Go驱动模块。
    • os:Golang标准库,提供与操作系统交互的功能(文件操作、环境变量)。本示例中os包用于从环境变量获取参数值,驱动不依赖此包。
    • log:Golang标准库,提供日志记录功能,常用于输出错误信息或调试日志。本示例中log包用于打印日志,驱动不依赖此包。

  3. 调用os.Getenv()方法从环境变量获取IP地址、端口号、用户名、密码。

    hostip := os.Getenv("GOHOSTIP")   
    port := os.Getenv("GOPORT")       
    usrname := os.Getenv("GOUSRNAME") 
    passwd := os.Getenv("GOPASSWD")   

  4. 采用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方法输出错误信息。
    }   

  5. 调用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地址、端口号、数据库名、其他参数,步骤如下:

  1. 设置环境变量。

    export PGHOST="XXX.XXX.XXX.XXX"
    export PGPORT=XXX
    export PGDATABASE="XXX"
    export PGSSLMODE="disable"
    export GOUSRNAME="XXX"
    export GOPASSWD="XXXXXXX"

  2. 引用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包用于打印日志,驱动不依赖此包。

  3. 调用os.Getenv()方法获取用户名、密码。

    usrname := os.Getenv("GOUSRNAME") 
    passwd := os.Getenv("GOPASSWD")   

  4. 采用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方法输出错误信息。
    }

  5. 调用db.Ping()验证数据库建连是否成功。

    err = db.Ping()  
    if err != nil {
          log.Fatal(err)  //err不为nil表明连接失败,则会执行log.Fatal输出连接失败的原因。
    }

步骤2-步骤5为示例中的业务代码。

相关文档