引言
Kingbase 作为国产数据库代表,本文将介绍Go语言通过Gokb驱动连接KingbaseES 数据库的全流程,包含环境配置、连接验证、SQL执行及常见问题处理,从基础连接到高级操作全面掌握这一技术栈。
KingbaseES 数据库【系列篇章】:
| No. | 文章地址(点击进入) |
|---|---|
| 1 | 电科金仓KingbaseES数据库解析:国产数据库的崛起与技术创新 |
| 2 | KingBase数据库迁移利器:KDTS工具深度解析与实战指南 |
| 3 | KingBase数据库迁移利器:KDTS工具 MySQL数据迁移到KingbaseES实战 |
| 4 | 电科金仓KingbaseES V9数据库:国产数据库的自主创新与行业实践深度解析 |
| 5 | KingbaseES客户端工具Ksql使用全指南:从安装到高级操作 |
| 6 | Spring JDBC与KingbaseES深度集成:构建高性能国产数据库应用实战 |
| 7 | 深度解析:基于 ODBC连接 KingbaseES 数据库的完整操作与实践 |
| 8 | Python驱动Ksycopg2连接和使用Kingbase:国产数据库实战指南 |
一、环境准备
已安装与驱动对应版本的数据库,且数据库连接可用。
1.1 下载Go
官方地址:https://go.dev/dl/
1.2 安装Go
| 操作系统 | 描述 |
|---|---|
| Windows | 下载 .msi 安装包并运行,按照提示完成安装 |
| macOS | 下载 .pkg 文件并运行安装程序完成安装 |
| Linux | 下载 .tar.gz 文件,解压并配置 |
以下是 Linux 的示例:
tar -zxvf go1.x.x.linux-amd64.tar.gz
export PATH=/go解压后的目录/go/bin:$PATH
1.3 验证安装
在终端运行命令
go version
输出 go version go1.x.x [os/arch]即表示安装成功
二、使用GOPATH管理Gokb
使用 GOPATH 管理 Gokb(GOPATH或GOMODULE根据需要选择一种即可)
2.1 查看或配置GOPATH
使用命令查看当前的GOPATH的路径:
go env
也可以通过命令设置其它的路径为GOPATH
export GOPATH=xxx
或
go env -w GOPATH=xxx
使用命令 go env 查看 GO111MODULE,默认为空,表示当项目下存在 go.mod 文件时通过 GOMODULE 管理,否则通过 GOPATH 管理,不同 go 版本可能存在差异,可通过命令强制指定使用 GOPATH 管理:
export GOPATH=off
或
go env -w GOPATH=off
2.2 配置 Gokb
解压 go 驱动源码,将解压后的 kingbase.***/gokb 完整放置在 GOPATH 的 src 路径下,没有 src 路径时可手动创建。
通过 shell 命令下载 Gokb 的依赖:
go get github.***/shopspring/decimal@latest
go get github.***/golang-sql/civil@latest
如果使用的是 go1.17 及更高版本,go get 不支持在非 GOMODULE 下添加依赖,可以使用 go install 替换 go get 命令。
下载的依赖在 $GOPATH/pkg/mod 目录下,比如 $GOPATH/pkg/mod/github.***/shopspring/decimal@v1.4.0,
将两个依赖包不保留版本号拷贝到 $GOPATH/src 目录下,比如拷贝为 $GOPATH/src/github.***/shopspring/decimal 即可。
2.3 导入Gokb(此代码在示例文件中已包含)
在用例文件中通过 _ 方式导入Gokb驱动即可通过 go 的官方包 database/sql 操作数据库
import (
"database/sql"// 提供数据库连接操作等api
"kingbase.***/gokb"// 往往不直接导入数据库驱动包,除非要使用驱动包中的特有能力
_ "kingbase.***/gokb"// 通过_方式导入会调用驱动包的初始化函数,完成注册驱动
)
2.4 编译示例并执行
修改示例文件中的连接串,使用命令编译名为test.go的用例文件,得到可执行文件test通过./test执行即可
go build test.go
或可通过以下命令直接执行,此命令包含编译并执行,但是不会生成可执行文件
go run test.go
三、使用GOMODULE管理Gokb
使用 GOMODULE 管理 Gokb(GOPATH或GOMODULE根据需要选择一种即可)
3.1 查看或配置 GOMODULE
在 go 1.11 引入 GO MODULE 管理包,使用以下命令查看 GO111MODULE,默认为空,表示当项目下存在 go.mod 文件时通过 GOMODULE 管理否则通过 GOPATH 管理
go env
不同 go 版本可能存在差异,可通过命令以下命令强制指定使用 GOMODULE 管理
export GOPATH=on 或 go env -w GOPATH=on
在工程目录下使用以下命令初始化一个名为 test 的项目
go mod init test
得到一个go.mod文件,初始内容为
module test
go 1.18
3.2 配置 Gokb
使用 GOMODULE 管理依赖包时可以在联网环境下自动拉取或删除项目所需的依赖包,Gokb 尚未发布到开源网站,所以需要手动配置位置
解压 go 驱动源码,将 kingbase.***/gokb 源码放置在需要的任意位置即可
修改 go.mod,添加以下内容:
module test
go 1.18
require kingbase.***/gokb v1.0.0
replace kingbase.***/gokb \=\> kingbase.***/gokb所在的绝对路径或相对路径
执行以下命令自动拉取项目所需要的其它依赖:
go mod tidy
该命令也会同时拉取 Gokb 所需的依赖包并指定所需的版本,不需要再手动进行管理
3.3 编译用例并执行
修改示例文件中的连接串,使用命令编译名为 test.go 的用例文件,得到可执行文件 test,通过 ./test 执行即可。
go build test.go
或可通过以下命令直接执行,此命令包含编译并执行,但是不会生成可执行文件
go run test.go
四、文件示例模版
package main
import (
"database/sql" // 提供数据库连接操作等api
"fmt" // 提供格式化输出的api
_ "kingbase.***/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) (db *sql.DB, err 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) (err error) {
txn, err := db.Begin()
defer txn.***mit()
if err != nil {
return err
}
_, err = txn.Exec(sql)
if err != nil {
return err
}
return nil
}
func testInsert(db *sql.DB, sql string) (err error) {
err = testTran(db, sql)
return err
}
//通过预备语句执行
func testPrepare(db *sql.DB, sql string) (err 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) (data []*GoTable, err 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 su***ess!")
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 su***ess!")
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 su***ess!")
err = testPrepare(db, "insert into temp_golang_test values($1,$2,$3,$4)")
if err != nil {
panic(err)
}
fmt.Println("Prepare and execute test su***ess!")
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 su***ess!")
}
五、总结
本文通过Go+Gokb+Kingbase的集成方案,覆盖了从环境搭建到SQL操作的全流程。重点强调了连接验证、参数化查询、事务管理三大核心,并针对常见编译、连接、类型问题提供了解决方案。后续博主会继续介绍 Kingbase 数据库的SQL语法。