
# 以非加密方式连接
使用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驱动兼容](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0306.html#ZH-CN_TOPIC_0000002590200424__section1722122104010)。
   
- 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\[\&...\]。
    
  
  
  ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
  - 在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"
   )
   ```
   ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
   - 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输出连接失败的原因。
   }
   ```
   
   
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
步骤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"
   )
   ```
   ![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
   - database/sql：Golang标准库，提供通用的数据库操作接口，定义与数据库交互的核心方法（如 Query(), Exec(), Prepare() 等）。
   
   - _ "\[go驱动模块名\]"：Go驱动模块，通过[此步骤](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0252.html#ZH-CN_TOPIC_0000002620639779__li12001924648)将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输出连接失败的原因。
   }
   ```
   
   
![](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
步骤2-步骤5为示例中的业务代码。
