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

本文介绍了如何利用Go语言的database/sql接口操作DM数据库,包括环境准备(DM数据库8.0以上版本和Go1.17.8),Go环境的安装与配置,达梦数据库驱动的安装,以及Go代码中连接、操作数据库的示例。在CentOS7环境下,解决编译错误unrecognizedrelocation(0x2a)的方法是升级GNUBinutils到2.26以上版本。
摘要由CSDN通过智能技术生成

一、前言

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

二、开发环境准备

名称版本
DM 数据库DM 8.0 及以上版本
GOGo 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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值