Go语言×Kingbase数据库极速打通:Gokb驱动三步实操,让国产数据库连接效率嘎嘎提升!

Go语言×Kingbase数据库极速打通:Gokb驱动三步实操,让国产数据库连接效率嘎嘎提升!

引言

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语法。

转载请说明出处内容投诉
CSS教程网 » Go语言×Kingbase数据库极速打通:Gokb驱动三步实操,让国产数据库连接效率嘎嘎提升!

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买