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

}

}

相关推荐
卑微的小鬼几秒前
Go 语言结合 Redis 实现固定窗口、滑动窗口、令牌桶和漏桶限流算法的示例代码
开发语言·redis·golang
vip1024p7 分钟前
第二篇:MySQL安装与配置(基于小皮面板(phpstudy))
数据库·mysql·adb
limts7 分钟前
Oracle中补全时间的处理
数据库·oracle
woshilys11 分钟前
sql server 从库创建的用户名登录后访问提示数据库无权限
数据库·sqlserver
ylfhpy13 分钟前
Python常见面试题的详解16
开发语言·python·面试
handsomestWei14 分钟前
java实现多图合成mp4和视频附件下载
java·开发语言·音视频·wutool·图片合成视频·视频附件下载
宝哥的菜鸟之路24 分钟前
Python 数据分析概述 ①
开发语言·python·数据分析
全栈若城25 分钟前
03 Python字符串与基础操作详解
java·开发语言·python
YGGP1 小时前
【Gee】Day5:中间件
中间件·golang
honghongstand1 小时前
代码随想录D52-53 图论 Python
开发语言·python·图论