5.3. GO-GCI应用示例(Linux)

本章将介绍GBase 8s的GO(GO-GCI)的基础的操作演示。

5.3.1. 示例环境介绍

操作系统:Ubuntu 22.04.3 LTS (x86_64)
数据库版本:GBase 8s v8.8_3.6.3_3x2_1
GO版本:go version go1.24.5 linux/amd64

5.3.2. GSDK下载及安装

GSDK驱动包的名称一般为:GSDK_3.6.3_3X2_1_1.1.0_1_eff9f1_RHEL6_x86_64.tar
示例使用的GDSK下载地址:https://dl.gbase8s.com:9088/GSDK/

GSDK需要使用1.1.x版本,该版本暂时需要通过GBase 8s技术支持或通过官方渠道获取。
如下,本次使用的版本为: GSDK_3.6.3_3X2_1_1.1.0_1_eff9f1_RHEL6_x86_64.tar
说明:

  • 3.6.3_3X2_1:对应的数据库版本号

  • 1.1.0_1:GSDK版号本

  • eff9f1:内部GIT

  • RHEL6:编译的操作系统版本

  • x86_64:适用的架构

上传到服务器,解压并改名

tar -xvf GSDK_3.6.3_3X2_1_1.1.0_1_eff9f1_RHEL6_x86_64.tar -C /opt
mv /opt/GSDK_3.6.3_3X2_1_1.1.0_1_eff9f1_RHEL6_x86_64 /opt/GSDK

设置环境变量,并加载

root@netsky:~# more env_gsdk
export GSDK_PATH=/opt/GSDK
export LD_LIBRARY_PATH=${GSDK_PATH}/lib:$LD_LIBRARY_PATH
export GBASEDBTDIR=${GSDK_PATH}/lib
# for golang
export CGO_CFLAGS="-I/opt/GSDK/include"
export CGO_LDFLAGS="-L/opt/GSDK/lib -lclntsh_gbase"

root@netsky:~# . env_gask

5.3.3. 确认安装go及版本

确认已经安装go

root@netsky:~# # go version
go version go1.24.5 linux/amd64

如果没有安装,建议使用snap install go –classic来安装。

5.3.4. 安装GO-GCI

GO-GCI存储于gitee.com,需要设置GOPRIVATE

root@netsky:~#  export GOPRIVATE=gitee.com

使用go install 安装

root@netsky:~# go install gitee.com/GBase8s/go-gci@latest
go: downloading gitee.com/GBase8s/go-gci v0.1.1
package gitee.com/GBase8s/go-gci is not a main package

5.3.5. 编写测试代码

创建目录GOSample

root@netsky:~# mkdir GOSample

进入目录模块初始化

root@netsky:~# cd GOSample

root@netsky:~/GOSample# go mod init GOSample 

增加go-gci

root@netsky:~/GOSample# go get gitee.com/GBase8s/go-gci
go: added gitee.com/GBase8s/go-gci v0.1.1

编写测试代码GOSample.go

package main

import (
        "database/sql"
        "fmt"
        _ "gitee.com/GBase8s/go-gci"
        "log"
)
func main() {
        // 设置DSN,这里需要注意密码的特殊字符限制。
        Gbase8sDSN := "gbase8s://gbasedbt:GBase123@192.168.0.212:13633/testdb?GBASEDBTSERVER=gbase01&PROTOCOL=onsoctcp&sqlmode=oracle&delimident=1&GOGCILogTrace=0"

        // 使用 go-gci 连接数据库
        db, err := sql.Open("gbase8s", Gbase8sDSN)
        if err != nil {
                log.Fatalf("数据库连接失败: %v\n", err)
        }
        defer db.Close()

        // 测试数据库连接
        err = db.Ping()
        if err != nil {
                log.Fatalf("无法连接到数据库: %v\n", err)
        }
        fmt.Println("数据库连接成功!")

        // 删除表
        _, err = db.Exec("drop table if exists company")
        if err != nil {
                log.Fatalf("删除表异常:%v\n", err)
                return
        }
        fmt.Println("删除表成功!")

        // 创建表
        _, err = db.Exec("create table company(coid serial,coname varchar(255),coaddr varchar(255), primary key(coid))")
        if err != nil {
                log.Fatalf("创建表异常:%v\n", err)
                return
        }
        fmt.Println("创建表成功!")

        // 插入数据
        _, err = db.Exec("insert into company values(0,?,?),(0,?,?)","GBase","TJ","GBase BeiJing","BJ")
        if err != nil {
                log.Fatalf("插入异常:%v\n", err)
                return
        }
        fmt.Println("正常插入!")

        // 查询并显示数据
        rows, err := db.Query("select * from company")
        if err != nil {
                log.Fatalf("查询异常:%v\n", err)
                return
        }
        defer rows.Close()
        for rows.Next(){
                var coid int
                var coname string
                var coaddr string
                if err := rows.Scan(&coid,&coname,&coaddr); err == nil {
                        fmt.Printf("COID:%d\tCONAME:%s\tCOADDR:%s\n",coid,coname,coaddr)
                }
        }
        fmt.Println("查询成功!")
}

执行测试

root@netsky:~/GOSample# go run GOSample.go          # go run -tags noPkgConfig GOSample.go
数据库连接成功!
删除表成功!
创建表成功!
正常插入!
COID:1  CONAME:GBase    COADDR:TJ
COID:2  CONAME:GBase BeiJing    COADDR:BJ
查询成功!