linux下go语言连接达梦数据库

一、前言

Go 语言标准库 database/sql提供了一系列数据库操作的标准接口,DM 数据库基于 GO 1.13 版本通过实现 database/sql 包的接口,向开发人员提供 DM 数据库操作的 Go 语言接口。

二、开发环境准备

名称 版本
DM 数据库 DM 8.0 及以上版本
GO Go 1.17.8

三、配套软件安装

3.1 达梦数据库安装

请参考数据库环境准备。

3.2 安装 Go 环境安装

3.2.1 下载Go环境包

从官网下载 Go 1.17.8 Windows-amd 64 安装包,可选择下载解压版或安装版,如下图所示:

[root@localhost ~]# wget https://dl.google.com/go/go1.17.8.linux-amd64.tar.gz

3.2.2 解压Go安装包

将安装包指定到指定目录 /usr/local目录下,可以看到名为 go 的目录,这个目录就是 Go 的安装目录,也是 Go 官方推荐的 Go 安装目录。

[root@localhost ~]# tar -C /usr/local/ -xzf go1.17.8.linux-amd64.tar.gz

3.2.3 配置go的环境变量

# 新建GOPATH的依赖目录 存放依赖
[root@localhost ~]# mkdir /opt/go_moudle
[root@localhost ~]# cd /opt/go_moudle

# 配置用户的环境变量
[root@localhost ~]# vi ~/.bash_profile
# go的安装目录
export GOROOT=/usr/local/go
export GOPATH=/opt/go_moudle
export PATH=$PATH:$GOROOT/bin:$GOPATH
export GO111MODULE="on" # 开启 Go moudles 特性
export GOPROXY=https://goproxy.cn,direct # 安装 Go 模块时,国内代理服务器设置

[root@localhost ~]# source ~/.bash_profile 

3.2.4 验证go的安装版本

[root@localhost ~]# go version
go version go1.17.8 linux/amd64

四、go中配置达梦驱动依赖

# 新建代码运行路径,不能与GOPATH变量是同一个目录
[root@localhost ~]# mkdir /opt/go_code
[root@localhost ~]# cd /opt/go_code
# 初始化项目工程
[root@localhost go_code]# go mod init go_conn_dm8
go: creating new go.mod: module go_conn_dm8

## 下载依赖包 golang.org/x/text
[root@localhost go_code]# go get golang.org/x/text
go: downloading golang.org/x/text v0.8.0
go get: added golang.org/x/text v0.8.0

## 下载依赖包 github.com/golang/snappy
[root@localhost go_code]# go get github.com/golang/snappy
go: downloading github.com/golang/snappy v0.0.4
go get: added github.com/golang/snappy v0.0.4

## 将达梦的go驱动包 放到go安装目录的src目录中
[root@localhost go]# cd $GOROOT/src
## go的驱动在达梦安装目录dmdbms/drivers/go目录下
## 将dm-go-driver.zip文件  手动上传到$GOROOT/src目录下
[root@localhost src]# rz -E
rz waiting to receive.
## 解压
[root@localhost src]# unzip dm-go-driver.zip 

五、开发示例

示例中使用的表是数据库目录中自带的示例文本,SQL在安装目录dmdbms\samples\instance_script\bookshop下。

5.1 go_conn.go

/*该例程实现插入数据,修改数据,删除数据,数据查询等基本操作。*/
package main
// 引入相关包
import (
"database/sql"
"dm"
"fmt"
"io/ioutil"
"time"
)
var db *sql.DB
var err error
func main() {
driverName := "dm"
dataSourceName := "dm://SYSDBA:SYSDBA@localhost:5236"
if db, err = connect(driverName, dataSourceName); err != nil {
fmt.Println(err)
return
}
if err = insertTable(); err != nil {
fmt.Println(err)
return
}
if err = updateTable(); err != nil {
fmt.Println(err)
return
}
if err = queryTable(); err != nil {
fmt.Println(err)
return
}
if err = deleteTable(); err != nil {
fmt.Println(err)
return
}
if err = disconnect(); err != nil {
fmt.Println(err)
return
}
}
/* 创建数据库连接 */
func connect(driverName string, dataSourceName string) (*sql.DB, error) {
var db *sql.DB
var err error
if db, err = sql.Open(driverName, dataSourceName); err != nil {
return nil, err
}
if err = db.Ping(); err != nil {
return nil, err
}
fmt.Printf("connect to \"%s\" succeed.\n", dataSourceName)
return db, nil
}
/* 往产品信息表插入数据 */
func insertTable() error {
var inFileName = "/opt/go_code/1.png"
var sql = `INSERT INTO production.product(name,author,publisher,publishtime,
product_subcategoryid,productno,satetystocklevel,originalprice,nowprice,discount,
description,photo,type,papertotal,wordtotal,sellstarttime,sellendtime)
VALUES(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16,:17);`
data, err := ioutil.ReadFile(inFileName)
if err != nil {
return err
}
t1, _ := time.Parse("2006-Jan-02", "2005-Apr-01")
t2, _ := time.Parse("2006-Jan-02", "2006-Mar-20")
t3, _ := time.Parse("2006-Jan-02", "1900-Jan-01")
_, err = db.Exec(sql, "三国演义", "罗贯中", "中华书局", t1, 4, "9787101046126", 10, 19.0000, 15.2000,
8.0,
"《三国演义》是中国第一部长篇章回体小说,中国小说由短篇发展至长篇的原因与说书有关。",
data, "25", 943, 93000, t2, t3)
if err != nil {
return err
}
fmt.Println("insertTable succeed")
return nil
}
/* 修改产品信息表数据 */
func updateTable() error {
var sql = "UPDATE production.product SET name = :name WHERE productid = 11;"
if _, err := db.Exec(sql, "三国演义(上)"); err != nil {
return err
}
fmt.Println("updateTable succeed")
return nil
}
/* 查询产品信息表 */
func queryTable() error {
var productid int
var name string
var author string
var description dm.DmClob
var photo dm.DmBlob
var sql = "SELECT productid,name,author,description,photo FROM production.product WHERE productid=11"
rows, err := db.Query(sql)
if err != nil {
return err
}
defer rows.Close()
fmt.Println("queryTable results:")
for rows.Next() {
if err = rows.Scan(&productid, &name, &author, &description, &photo); err != nil {
return err
}
blobLen, _ := photo.GetLength()
fmt.Printf("%v %v %v %v %v\n", productid, name, author, description, blobLen)
}
return nil
}
/* 删除产品信息表数据 */
func deleteTable() error {
var sql = "DELETE FROM production.product WHERE productid = 12;"
if _, err := db.Exec(sql); err != nil {
return err
}
fmt.Println("deleteTable succeed")
return nil
}
/* 关闭数据库连接 */
func disconnect() error {
if err := db.Close(); err != nil {
fmt.Printf("db close failed: %s.\n", err)
return err
}
fmt.Println("disconnect succeed")
return nil
}

5.2 编译运行

centos7环境下运行可能会报unrecognized relocation (0x2a) in section `.text’,解决方案请查看Q&A

[root@localhost go_code]# go build go_conn_dm8.go
[root@localhost go_code]# go run go_conn_dm8.go
connect to "dm://SYSDBA:SYSDBA@localhost:5236" succeed.
insertTable succeed
updateTable succeed
queryTable results:
deleteTable succeed
disconnect succeed

Q&A

1. unrecognized relocation (0x2a) in section `.text’

image.png

原因分析

操作系统的GNU的Binutils版本过低,需升级该版本到2.26

[root@localhost go_code]# ld -v
GNU ld version 2.23.52.0.1-30.el7 20130226

解决方案

binutils的下载地址 https://ftp.gnu.org/gnu/binutils/,需升级到2.26版本及以上版本

## 字行前往官网下载binutils包
## 解压binutils包
[root@localhost go_code]# tar -zxvf binutils-2.26.tar.gz
## 编译运行
[root@localhost go_code]# cd binutils-2.26
[root@localhost binutils-2.26]# ./configure --prefix=/usr/local/binutils
[root@localhost binutils-2.26]# make
[root@localhost binutils-2.26]# make install

## 配置环境变量
[root@localhost ~]# vi ~/.bash_profile
# 添加binutils的目录
export PATH=/usr/local/binutils/bin:$PATH
[root@localhost ~]# source ~/.bash_profile 

## 查看版本
[root@s11g binutils-2.26]# ld -v
GNU ld (GNU Binutils) 2.26.20160125

你可能感兴趣的:(达梦数据库,数据库,linux,golang,达梦)