golang适配国产数据库

随着国产化的推进,越来越多的企业选择国产数据库替代mysql或者Oracle。

本篇主要介绍golang如何适配国产数据库

主流的国产数据库有达梦,金仓,神通,优炫,南大通用数据库等

前提环境

unixODBC安装

bash 复制代码
yum -y install unixODBC unixODBC-devel

配置 gbase8s-odbc-driver

bash 复制代码
wget https://gbasedbt.com/dl/odbc/GBase8s_3.0.0_1-Linux64-ODBC-Driver.tar.gz --no-check-certificate
tar -zxf GBase8s_3.0.0_1-Linux64-ODBC-Driver.tar.gz

配置 sqlhosts

bash 复制代码
gbase01  onsoctcp        ip  9088    g=db_group
cm_update       group   -       -       i=2,c=0
w1      onsoctcp        ip  18888   g=cm_update
cm_read         group   -       -       i=3,c=0
r1      onsoctcp        ip  19999   g=cm_read

配置环境变量 (使用 root) vim /etc/profile

bash 复制代码
export GBASEDBTDIR=/home/gbase8s-odbc-driver
export GBASEDBTSERVER=gbase01
export PATH=$GBASEDBTDIR/bin:$PATH
export GBASEDBTSQLHOSTS=$GBASEDBTDIR/etc/sqlhosts
export LD_LIBRARY_PATH=$GBASEDBTDIR/lib:$GBASEDBTDIR/lib/esql:$GBASEDBTDIR/lib/cli:$LD_LIBRARY_PATH
export ODBCINI=/home/gbase8s-odbc-driver/odbc.ini

配置 驱动 (使用 root) vim /etc/odbcinst.ini

bash 复制代码
[com.gbasedbt.jdbc.Driver]
Driver=/home/gbase8s-odbc-driver/lib/cli/iclit09b.so
Setup=/home/gbase8s-odbc-driver/lib/cli/iclit09b.so
APILevel=1
ConnectFunctions=YYY
DriverODBCVer=03.51
FileUsage=0
SQLLevel=1
smProcessPerConnect=Y

配置 odbc.ini vim /home/linkdood/gbase8s-odbc-driver/odbc.ini

bash 复制代码
[ODBC]
UNICODE=UCS-2

测试驱动连接

bash 复制代码
isql -v -k "DRIVER={com.gbasedbt.jdbc.Driver};DB=testdataserver;UID=gbasedbt;pwd=GBase123;Server=gbase01;CLIENT_LOCALE=zh_CN.57372;DB_LOCALE=zh_CN.57372;"

golang通过odbc连接国产数据库

func init() {

file, err := os.Open("config.xml")

if err != nil {

Log.Info("error:%v", err)

return

}

defer file.Close()

config, err := ioutil.ReadAll(file)

if err != nil {

Log.Info("error:%v", err)

return

}

configValue := SConfig{}

err = xml.Unmarshal(config, &configValue)

if err != nil {

Log.Error("error:%v", err)

return

}

strKey := configValue.Server.Aid + configValue.Server.Elogo

var strPassword string

var strUsername string

strPassword = configValue.DataBase.Password

strUsername = configValue.DataBase.User

fmt.Printf("strPassword:%v\n", strPassword)

fmt.Printf("strUsername:%v\n", strUsername)

ServerPort = configValue.Server.Port

var dbDSN = "" //dataSourceName

var driverName = "" //驱动名

var DbServer = configValue.DataBase.Host + ":" + configValue.DataBase.Port

if configValue.DataBase.DbType == "mysql" {

fmt.Printf("mysql database\n")

driverName = "mysql"

dbDSN = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s", strUsername, strPassword, configValue.DataBase.Host, configValue.DataBase.Port, configValue.DataBase.DBName, configValue.DataBase.Charset)

} else if configValue.DataBase.DbType == "shentong" {

fmt.Printf("shentongsql database\n")

/driverName = "odbc"
dbDSN = fmt.Sprintf("driver={%s};server=%s;port=%s;database=%s;uid=%s;pwd=%s;charset=%s", configValue.DataBase.Driver, configValue.DataBase.Host, configValue.DataBase.Port, configValue.DataBase.DBName, strUsername, strPassword, configValue.DataBase.Charset)
/

driverName = "aci"

dbDSN = fmt.Sprintf("%s/%s@%s:%s/%s", strUsername, strPassword, configValue.DataBase.Host, configValue.DataBase.Port, configValue.DataBase.DBName)

} else if configValue.DataBase.DbType == "dameng" {

strPassword = CheckAndModifyString(strPassword)

fmt.Printf("dmsql database\n")

driverName = "dm"

//dbDSN = fmt.Sprintf("driver={%s};server=%s;database=%s;uid=%s;pwd=%s;charset=%s", configValue.DataBase.Driver, DbServer, configValue.DataBase.DBName, strUsername, strPassword, configValue.DataBase.Charset)

dbDSN = fmt.Sprintf("%s://%s:%s@%s?schema=%s", driverName, strUsername, strPassword, DbServer, configValue.DataBase.DBName)

} else if configValue.DataBase.DbType == "kingbase" {

fmt.Printf("kingbase database\n")

driverName = "odbc"

dbDSN = fmt.Sprintf("driver={%s};server=%s;port=%s;database=%s;uid=%s;pwd=%s;charset=%s", configValue.DataBase.Driver, configValue.DataBase.Host, configValue.DataBase.Port, configValue.DataBase.DBName, strUsername, strPassword, configValue.DataBase.Charset)

} else if configValue.DataBase.DbType == "GBase8s" {

fmt.Printf("GBase8s database\n")

driverName = "odbc"

dbDSN = fmt.Sprintf("driver={%s};server=%s;port=%s;database=%s;uid=%s;pwd=%s;charset=%s", configValue.DataBase.Driver, configValue.DataBase.Host, configValue.DataBase.Port, configValue.DataBase.DBName, strUsername, strPassword, configValue.DataBase.Charset)

}

dbType = configValue.DataBase.DbType

// 打开连接失败

MysqlDb, MysqlDbErr = sql.Open(driverName, dbDSN)

//defer MysqlDb.Close();

if MysqlDbErr != nil {

panic("数据源配置不正确: " + MysqlDbErr.Error())

}

// 最大连接数

MysqlDb.SetMaxOpenConns(100)

// 闲置连接数

MysqlDb.SetMaxIdleConns(20)

// 最大连接周期

MysqlDb.SetConnMaxLifetime(100 * time.Second)

if MysqlDbErr = MysqlDb.Ping(); nil != MysqlDbErr {

panic("数据库链接失败: " + MysqlDbErr.Error())

}

}

相关推荐
01_ice32 分钟前
MySQL库和表的操作
数据库·mysql
wuyk55536 分钟前
Python 第三章:列表 List
服务器·开发语言·python
Evand J1 小时前
【MATLAB例程,车联网7】CACC网联车辆协同控制:ACC对比、V2X时延丢包与队列稳定性,附例程下载链接
开发语言·matlab·车联网
布莱克6051 小时前
数据库索引分类:数据结构、物理存储与逻辑角度详解
数据结构·数据库
SelectDB1 小时前
DeepSeek Harness 接入 Litefuse:完善 Agent 可观测与评估能力
数据库
要努力点2 小时前
Python入门第六课
开发语言·python
萧瑟余晖2 小时前
Java深入解析篇三十三之消息队列
java·开发语言
这个DBA有点耶2 小时前
从库延迟的“二次放大”效应:一次大事务,拖垮整个读写分离
数据库·mysql·架构
IT爱学堂2 小时前
尚硅谷Java+AI大模型应用开发革新版本 2025年3月
java·开发语言·人工智能
C++ 老炮儿的技术栈3 小时前
Qt5.9.1 Windows 完整开发环境搭建流程
开发语言·c++·windows·qt·编辑器·代码化