引言
Kingbase 作为国产数据库代表,本文介绍 Go 语言通过 Gokb 驱动连接 KingbaseES 数据库的全流程,包含环境配置、连接验证、SQL 执行及常见问题处理。
Go 语言通过 Gokb 驱动连接 KingbaseES 数据库的全流程。涵盖环境配置、GOPATH 与 GOMODULE 两种依赖管理方式、代码示例及事务操作。重点解决连接验证、参数化查询及常见编译问题,提供完整的集成方案。

Kingbase 作为国产数据库代表,本文介绍 Go 语言通过 Gokb 驱动连接 KingbaseES 数据库的全流程,包含环境配置、连接验证、SQL 执行及常见问题处理。
已安装与驱动对应版本的数据库,且数据库连接可用。
官方地址:https://go.dev/dl/
| 操作系统 | 描述 |
|---|---|
| Windows | 下载 .msi 安装包并运行,按照提示完成安装 |
| macOS | 下载 .pkg 文件并运行安装程序完成安装 |
| Linux | 下载 .tar.gz 文件,解压并配置 |
以下是 Linux 的示例:
tar -zxvf go1.x.x.linux-amd64.tar.gz
export PATH=/go解压后的目录/go/bin:$PATH
在终端运行命令
go version
输出 go version go1.x.x [os/arch]即表示安装成功
使用 GOPATH 管理 Gokb(GOPATH 或 GOMODULE 根据需要选择一种即可)
使用命令查看当前的 GOPATH 的路径:
go env
也可以通过命令设置其它的路径为 GOPATH
export GOPATH=xxx 或 go env -w GOPATH=xxx
使用命令 go env 查看 GO111MODULE,默认为空,表示当项目下存在 go.mod 文件时通过 GOMODULE 管理,否则通过 GOPATH 管理,不同 go 版本可能存在差异,可通过命令强制指定使用 GOPATH 管理:
export GO111MODULE=off 或 go env -w GO111MODULE=off
解压 go 驱动源码,将 kingbase.com/gokb 完整放置在 GOPATH 的 src 路径下,没有 src 路径时可手动创建。
通过 shell 命令下载 Gokb 的依赖:
go get github.com/shopspring/decimal@latest
go get github.com/golang-sql/civil@latest
如果使用的是 go1.17 及更高版本,go get 不支持在非 GOMODULE 下添加依赖,可以使用 go install 替换 go get 命令。
下载的依赖在 $GOPATH/pkg/mod 目录下,比如 $GOPATH/pkg/mod/github.com/shopspring/[email protected],
将两个依赖包不保留版本号拷贝到 $GOPATH/src 目录下,比如拷贝为 $GOPATH/src/github.com/shopspring/decimal 即可。
在用例文件中通过 _ 方式导入 Gokb 驱动即可通过 go 的官方包 database/sql 操作数据库
import (
"database/sql" // 提供数据库连接操作等 api
"kingbase.com/gokb" // 往往不直接导入数据库驱动包,除非要使用驱动包中的特有能力
_ "kingbase.com/gokb" // 通过_方式导入会调用驱动包的初始化函数,完成注册驱动
)
修改示例文件中的连接串,使用命令编译名为 test.go 的用例文件,得到可执行文件 test 通过./test 执行即可
go build test.go
或可通过以下命令直接执行,此命令包含编译并执行,但是不会生成可执行文件
go run test.go
使用 GOMODULE 管理 Gokb(GOPATH 或 GOMODULE 根据需要选择一种即可)
在 go 1.11 引入 GO MODULE 管理包,使用以下命令查看 GO111MODULE,默认为空,表示当项目下存在 go.mod 文件时通过 GOMODULE 管理否则通过 GOPATH 管理
go env
不同 go 版本可能存在差异,可通过命令以下命令强制指定使用 GOMODULE 管理
export GO111MODULE=on 或 go env -w GO111MODULE=on
在工程目录下使用以下命令初始化一个名为 test 的项目
go mod init test
得到一个 go.mod 文件,初始内容为
module test
go 1.18
使用 GOMODULE 管理依赖包时可以在联网环境下自动拉取或删除项目所需的依赖包,Gokb 尚未发布到开源网站,所以需要手动配置位置
解压 go 驱动源码,将 kingbase.com/gokb 源码放置在需要的任意位置即可
修改 go.mod,添加以下内容:
module test
go 1.18
require kingbase.com/gokb v1.0.0
replace kingbase.com/gokb => kingbase.com/gokb 所在的绝对路径或相对路径
执行以下命令自动拉取项目所需要的其它依赖:
go mod tidy
该命令也会同时拉取 Gokb 所需的依赖包并指定所需的版本,不需要再手动进行管理
修改示例文件中的连接串,使用命令编译名为 test.go 的用例文件,得到可执行文件 test,通过 ./test 执行即可。
go build test.go
或可通过以下命令直接执行,此命令包含编译并执行,但是不会生成可执行文件
go run test.go
package main
import (
"database/sql" // 提供数据库连接操作等 api
"fmt" // 提供格式化输出的 api
_ "kingbase.com/gokb" // 通过_方式导入会调用驱动包的初始化函数,完成注册驱动
)
// 修改此处连接信息为已开启服务的 KES 的信息
const (
host = "127.0.0.1"
port = 54321
user = "system"
password = "123456"
dbname = "test"
)
// 操作的表结构
type GoTable struct {
Num int `db:"num"`
Text string `db:"text"`
Blob []byte `db:"blob"`
Clob string `db:"clob"`
}
// 建立连接
func testConn(connInfo string) (*sql.DB, error) {
db, err := sql.Open("kingbase", connInfo)
if err != nil {
return db, err
}
err = db.Ping()
if err != nil {
return db, err
}
return db, err
}
// 事务操作
func testTran(db *sql.DB, sql string) error {
txn, err := db.Begin()
defer txn.Commit()
if err != nil {
return err
}
_, err = txn.Exec(sql)
if err != nil {
return err
}
return nil
}
func testInsert(db *sql.DB, sql string) error {
err := testTran(db, sql)
return err
}
// 通过预备语句执行
func testPrepare(db *sql.DB, sql string) error {
stmt, err := db.Prepare(sql)
defer stmt.Close()
if err != nil {
return err
}
_, err = stmt.Exec(int64(100), "VARCHAR 中文示例文字", []byte{10, 20, 30, 40, 50}, "CLOB 中文示例文字")
if err != nil {
return err
}
return nil
}
// 查询操作
func testSelect(db *sql.DB, query string) ([]*GoTable, error) {
rows, err := db.Query(query)
defer rows.Close()
if err != nil {
return nil, err
}
for rows.Next() {
var row GoTable
err = rows.Scan(&row.Num, &row.Text, &row.Blob, &row.Clob)
if err != nil {
return nil, err
}
data = append(data, &row)
}
return data, nil
}
func main() {
connInfo := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, dbname)
db, err := testConn(connInfo)
if err != nil {
panic(err)
}
fmt.Println("Connection test success!")
defer db.Close()
err = testTran(db, "CREATE temp TABLE temp_golang_test (num INTEGER, text VARCHAR, blob BLOB, clob CLOB)")
if err != nil {
panic(err)
}
fmt.Println("Transaction test success!")
err = testInsert(db, "insert into temp_golang_test(num,text,blob,clob) values(123456,'ABC!@#123','abcdef123456','123456!@#$%^');")
if err != nil {
panic(err)
}
fmt.Println("Insert data test success!")
err = testPrepare(db, "insert into temp_golang_test values($1,$2,$3,$4)")
if err != nil {
panic(err)
}
fmt.Println("Prepare and execute test success!")
data, err := testSelect(db, "select * from temp_golang_test;")
if err != nil {
panic(err)
}
fmt.Println(data[0], "\n", data[1])
fmt.Println("Select test success!")
}
本文通过 Go+Gokb+Kingbase 的集成方案,覆盖了从环境搭建到 SQL 操作的全流程。重点强调了连接验证、参数化查询、事务管理三大核心,并针对常见编译、连接、类型问题提供了解决方案。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online