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())

}

}

相关推荐
wjs202415 分钟前
XSLT 实例:掌握 XML 转换的艺术
开发语言
萧鼎19 分钟前
Python第三方库选择与使用陷阱避免
开发语言·python
安冬的码畜日常21 分钟前
【D3.js in Action 3 精译_029】3.5 给 D3 条形图加注图表标签(上)
开发语言·前端·javascript·信息可视化·数据可视化·d3.js
一颗星星辰25 分钟前
C语言 | 第十章 | 函数 作用域
c语言·开发语言
lxp19974126 分钟前
php函数积累
开发语言·php
科技资讯早知道30 分钟前
java计算机毕设课设—坦克大战游戏
java·开发语言·游戏·毕业设计·课程设计·毕设
全栈师35 分钟前
SQL Server中关于个性化需求批量删除表的做法
数据库·oracle
白拾41 分钟前
使用Conda管理python环境的指南
开发语言·python·conda
Data 31743 分钟前
Hive数仓操作(十七)
大数据·数据库·数据仓库·hive·hadoop
从0至11 小时前
力扣刷题 | 两数之和
c语言·开发语言