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

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

引言

Kingbase 作为国产数据库代表,本文将介绍Go语言通过Gokb驱动连接KingbaseES 数据库的全流程,包含环境配置、连接验证、SQL执行及常见问题处理,从基础连接到高级操作全面掌握这一技术栈。

KingbaseES 数据库【系列篇章】

No.文章地址(点击进入)
1电科金仓KingbaseES数据库解析:国产数据库的崛起与技术创新
2KingBase数据库迁移利器:KDTS工具深度解析与实战指南
3KingBase数据库迁移利器:KDTS工具 MySQL数据迁移到KingbaseES实战
4电科金仓KingbaseES V9数据库:国产数据库的自主创新与行业实践深度解析
5KingbaseES客户端工具Ksql使用全指南:从安装到高级操作
6Spring JDBC与KingbaseES深度集成:构建高性能国产数据库应用实战
7深度解析:基于 ODBC连接 KingbaseES 数据库的完整操作与实践
8Python驱动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 exportPATH=/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

exportGOPATH=xxx 或 go env -w GOPATH=xxx 

使用命令 go env 查看 GO111MODULE,默认为空,表示当项目下存在 go.mod 文件时通过 GOMODULE 管理,否则通过 GOPATH 管理,不同 go 版本可能存在差异,可通过命令强制指定使用 GOPATH 管理:

exportGOPATH=off 或 go env -w GOPATH=off 

2.2 配置 Gokb

解压 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 即可。

2.3 导入Gokb(此代码在示例文件中已包含)

在用例文件中通过 _ 方式导入Gokb驱动即可通过 go 的官方包 database/sql 操作数据库

import("database/sql"// 提供数据库连接操作等api "kingbase.com/gokb"// 往往不直接导入数据库驱动包,除非要使用驱动包中的特有能力 _ "kingbase.com/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 管理

exportGOPATH=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.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 所需的依赖包并指定所需的版本,不需要再手动进行管理

3.3 编译用例并执行

修改示例文件中的连接串,使用命令编译名为 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"`}//建立连接functestConn(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 }//事务操作functestTran(db *sql.DB, sql string)(err error){ txn, err := db.Begin()defer txn.Commit()if err !=nil{return err }_, err = txn.Exec(sql)if err !=nil{return err }returnnil}functestInsert(db *sql.DB, sql string)(err error){ err =testTran(db, sql)return err }//通过预备语句执行functestPrepare(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 }returnnil}//查询操作functestSelect(db *sql.DB, query string)(data []*GoTable, err error){ rows, err := db.Query(query)defer rows.Close()if err !=nil{returnnil, err }for rows.Next(){var row GoTable err = rows.Scan(&row.Num,&row.Text,&row.Blob,&row.Clob)if err !=nil{returnnil, err } data =append(data,&row)}return data,nil}funcmain(){ 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操作的全流程。重点强调了连接验证、参数化查询、事务管理三大核心,并针对常见编译、连接、类型问题提供了解决方案。后续博主会继续介绍 Kingbase 数据库的SQL语法。

Read more

C++之基于正倒排索引的Boost搜索引擎项目日志+server代码及详解

C++之基于正倒排索引的Boost搜索引擎项目日志+server代码及详解

首先为了更好的查看自己的项目状况,日志是我们做项目可以说必须要写的一部分。而server部分我们可以理解为写了这么多的类就是为了在这里使用。 1. 日志 __FILE__和__LINE__是 C/C++ 编译器预定义的特殊宏: __FILE__: 它会被编译器自动替换为当前代码所在源文件的路径或文件名(字符串类型)。 在日志函数中,它的作用是记录 “这条日志是从哪个文件输出的”。 例如:如果在 test.cpp 中调用 LOG1 宏,__FILE__ 就会被替换为 "test.cpp"(具体可能包含路径,取决于编译器),最终日志中会显示 [test.cpp : ...]。 __LINE__: 它会被编译器自动替换为当前代码所在的行号(整数类型)。 在日志函数中,它的作用是记录 “这条日志是从文件的哪一行输出的”。 例如:如果 LOG1 宏调用写在 test.cpp 的第 25

By Ne0inhk
C++的核心--继承

C++的核心--继承

目录 前言 一、继承的概念及定义 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、继承与友元 六、继承与静态成员 七、复杂的菱形继承及菱形虚拟继承 (一)单继承与多继承 (二)菱形继承 (三)菱形虚拟继承 八、继承的总结和反思 结语 前言 在C++ 编程世界里,继承是一项极为关键的特性,它为代码的复用和层次化设计提供了强大支持。掌握继承机制,对于编写高效、可维护的C++ 代码至关重要。今天,就让我们一起深入探究C++ 中的继承。 一、继承的概念及定义 继承是面向对象程序设计实现代码复用的重要手段。它允许我们在保持原有类特性的基础上进行扩展,产生新的类,即派生类。这体现了面向对象程序设计的层次结构,从简单到复杂逐步构建。 定义格式上,以 class Student : public

By Ne0inhk
C++微服务实战中好友管理子服务的全面解析

C++微服务实战中好友管理子服务的全面解析

【C++ 微服务实战】IM 好友管理子服务全解析:从 Proto 定义到高可用部署 在即时通讯(IM)系统中,好友管理子服务是连接 “用户社交关系” 与 “聊天会话” 的核心枢纽 —— 它既要处理好友申请、关系维护,也要管理单聊 / 群聊会话的创建与成员维护。本文基于实际项目代码(C++/brpc/Protobuf/ODB),从 “接口设计”“数据模型”“核心逻辑”“高可用部署” 四个维度,完整拆解好友管理子服务的实现细节,带你理解如何构建一个解耦、可靠的微服务。 一、服务定位与技术栈 在 IM 微服务架构中,好友管理子服务(Friend Server)的核心职责是 **“管理用户社交关系” 与 “维护聊天会话容器”**,向上对接网关服务接收客户端请求,向下依赖 MySQL/ES 存储数据,

By Ne0inhk
【C++】类和对象(中)

【C++】类和对象(中)

一、类的默认成员函数 编译器会自动生成的成员函数称为默认成员函数。一个类,不写的情况下编译器会默认生成以下6个默认成员函数。另外在C++11中,增加了两个默认成员函数,移动构造和移动赋值。默认成员函数从两方面学习: 1. 我们不写时,编译器默认生成的函数行为是啥?满足我们的需求吗? 编译器默认生成的函数不满足我们的需求,那如何自己实现? 二、构造函数 构造函数主要任务是对象实例化时初始化对象。就像每次写栈或队列时需要初始化Stack Init()、Queue Init(),用了构造函数就不需要写这一步。 构造函数的特点:函数名与类名相同:类class Stack,类中的函数Stack()无返回值。也无void对象实例化时系统会自动调用对应的构造函数构造函数可以重载如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成无参构造函数、全缺省构造函数、我们不写构造时编译器默认生成的构造函数,都叫做默认构造函数。但是这三个函数有且只有一个存在,不能同时存在。无参构造函数和全缺省构造函数虽然构成函数重载,但是调用时会存在歧

By Ne0inhk