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

使用Go驱动连接DWS集群

DWS提供了一款专为Go语言设计的数据库驱动,支持连接管理、数据操作、事务处理、错误处理及SSL加密通信等功能,旨在帮助用户高效、安全地完成数据探查和共享任务。用户在创建好数据仓库集群后使用Go驱动连接到集群,则可以使用Go语言代码访问DWS,并进行数据表的各类操作。

连接集群前的准备

  • DWS集群已绑定弹性IP。
  • 已获取DWS集群的数据库管理员用户名和密码。

    请注意,由于MD5算法已经被证实存在碰撞可能,已严禁将之用于密码校验算法。当前DWS采用默认安全设计,默认禁止MD5算法的密码校验,可能导致开源客户端无法正常连接的问题。建议先联系技术支持人员检查数据库参数password_encryption_type参数是否为1,如果取值不为1,需要修改为准备使用的数据库用户的密码。

    • 当前DWS出于安全考虑,已经默认不再使用MD5存储密码摘要,这将导致使用开源驱动或者客户端无法正常连接数据库。需要您调整密码策略后再创建一个新用户或者对老用户做一次密码修改,方可使用开源协议中的MD5认证算法。
    • 数据库中是不会存储用户的密码原文,而是存储密码的HASH摘要,在密码校验时与客户端发来的密码摘要进行比对(中间会有加盐操作)。故当您改变了密码算法策略时,数据库也是无法还原您的密码,再生成新的HASH算法的摘要值的。必须您手动修改一次密码或者创建一个新用户,这时新的密码将会采用您设置的HASH算法进行摘要存储,用于下次连接认证。
  • 已获取DWS集群的公网访问地址,含IP地址和端口。具体请参见获取DWS集群连接地址

使用Go驱动连接集群

在Linux和Windows环境下操作方法相同,以下步骤以Windows环境为例。

  1. 下载驱动包“dws-driver-go_v1.0.zip ”和“dws-driver-go_v1.0.zip.sha256”。
  2. 使用certutil校验文件的完整性。其中certutil为Windows操作系统工具,可执行与证书相关的任务。如果用户使用Linux环境则需单独安装该工具进行校验。

    在已下载的dws-driver-go_v1.0.zip包目录下打开“命令提示符”程序窗口,执行以下命令:
    certutil -hashfile dws-driver-go_v1.0.zip SHA256

    执行后会将输出中的hash值与dws-driver-go_v1.0.zip.sha256中的值进行对比,如果一致则证明下载文件完整。命令输出示例:

    SHA256 的 dws-driver-go_v1.0.zip 哈希:
    67f28e96d6b521bf1c1d7fca01c4ff7c5e4b28a7d28cbfb566c3bcf4ff9c25bd
    CertUtil: -hashfile 命令成功完成。

  3. 下载并安装Go。用户可从Go的官方下载页面(https://go.dev/dl/)下载特定版本的安装包,当前支持1.13及以上版本。

    1. 下载Go安装包。例如对于Go 1.13,可下载“ go1.13.windows-386.msi”文件。
    2. 运行安装程序。双击下载的.msi文件,按照安装向导的提示进行安装。用户可指定安装路径,默认情况下Go会被安装到“C:\Program Files (x86)\Go\”目录。
      图1 安装程序
    3. 设置环境变量。打开“系统属性 > 高级 > 环境变量”,在系统变量中添加GOBINGOPATH,并编辑PATH变量。
      • GOBIN:添加Go安装包下bin的目录,例如“C:\Program Files (x86)\Go\bin”。
      • GOPATH:选择一个目录,例如“C:\Users\<YourUsername>\go”。
      • PATH:添加“C:\Program Files (x86)\Go\bin”和 %GOPATH%\bin
        图2 设置环境变量
    4. 验证安装。打开命令提示符,检查Go是否安装成功。
      go version

  4. go.mod文件中添加“github.com/lib/pq”某版本的依赖,然后导入本地驱动包进行替换。其中“github.com/lib/pq”是一个常用的PostgreSQL驱动,DWS基于PostgreSQL,因此可以使用相同的驱动进行连接。

    1. go.mod文件中添加“github.com/lib/pq”的依赖,并指定版本,例如用户想使用v1.10.2版本。
      require github.com/lib/pqv1.10.2
    2. go.mod文件中使用replace指令将“github.com/lib/pq”替换为本地的驱动包。假设你的本地驱动包路径是“ D:\down\chromeDown\dws-driver-go”(可自由指定,需要绝对路径),可以在go.mod文件中添加以下内容。
      replace github.com/lib/pqv1.10.2=> D:\down\chromeDown\dws-driver-go
    3. 执行以下命令清理不必要的依赖并构建项目,确保替换的依赖被正确使用。
      go mod tidy 

  5. 新建一个Go文件(例如demo.go),并在其中编写连接DWS集群的代码,可参考下面示例。

    其中DWS的连接字符串格式如下所示,用户可根据实际DWS集群配置进行修改。
    user=<数据库用户> password=<数据库密码> dbname=<数据库名称> host=<主机IP地址> port=<数据库端口>
    表1 数据库连接参数

    参数名称

    参数说明

    host

    主机IP地址。

    port

    主机服务器的端口号。

    dbname

    数据库名称。

    user

    要连接的用户名。

    password

    要连接用户对应的连接密码。

    connect_timeout(可选)

    用于连接服务器操作的超时值。

    sslmode(可选)

    启用SSL加密的方式。

    参数取值范围:
    • disable:不使用SSL安全连接。

    • allow:如果数据库服务器要求使用,则可以使用SSL安全加密连接,但不验证数据库服务器的真实性。

    • prefer:如果数据库支持,那么首选使用SSL安全加密连接,但不验证数据库服务器的真实性。

    • require:必须使用SSL安全连接,但是只做了数据加密,而并不验证数据库服务器的真实性。

    • verify-ca:必须使用SSL安全连接,并验证服务器是否具有由可信任的证书机构签发的证书。

    • verify-full:必须使用SSL安全连接,并且验证服务器是否具有由可信任的证书机构签发的证书,以及验证服务器主机名是否与证书中的一致。

    sslkey(可选)

    客户端SSL私钥文件路径(与sslcert配对使用)。

    sslcert(可选)

    客户端SSL证书文件路径(双向SSL认证时,服务器验证客户端身份)。

    sslrootcert(可选)

    SSL根证书文件路径(用于验证服务器证书的合法性)。

    disable_prepared_binary_result(可选)

    字符串类型,若设置为yes,表示此连接在从预准备语句接收查询结果时不应使用二进制格式。该参数仅用于调试。

    取值范围:yes/no。

    binary_parameters(可选)

    字符串类型,该参数表示是否始终以二进制形式发送[]byte。取值范围:yes/no。若该参数设置为yes,建议绑定参数按照[]byte绑定,可以减少内部类型转换。

    以下是一个连接到DWS集群的示例代码:

    package main
    
    import (
        "database/sql"
        "fmt"
        _ "github.com/lib/pq"
        "log"
    )
    func main() {
        dsn := "user=dbadmin password=password dbname=postgres host=127.0.0.1 port=8000"
        // 初始化数据库连接
        db, err := sql.Open("postgres", dsn)
        if err != nil {
           log.Fatalf("连接数据库失败:%v", err)
        }
        defer db.Close()
        // 验证连接是否有效
        err = db.Ping()
        if err != nil {
           log.Fatalf("验证连接失败:%v", err)
        }
        fmt.Println("数据库连接成功!")
        // 执行查询
        var result int
        err = db.QueryRow("SELECT 1").Scan(&result)
        if err != nil {
           log.Fatalf("查询失败:%v", err)
        }
        // 输出结果
        fmt.Printf("查询结果:%d\n", result) // 输出:查询结果:1
    }

  6. 保存文件并运行代码。例如运行demo.go文件:

    go run demo.go

    成功连接到DWS集群并执行查询。如果连接报错,请检查连接字符串和网络配置,确保DWS集群是可访问的。

相关文档