Golang开发达梦数据库应用

Go 数据库接口

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

开发环境搭建

软件 版本
DM 数据库 DM 8.0 及以上版本
GO Go 1.13 Windows-amd 64
LiteIDE LiteIDE x20.1,Go 语言开发编辑器
GIT Git-2.29.2-64-bit

安装 DM 数据库

请参考 DM 数据库快速上手指南

数据库安装过程中,请勾选创建 BOOKSHOPDMHR 示例库,作为数据库模拟环境,如下图所示:

DMHR 示例库

安装 Go 环境

可从官网下载 Go 1.13 Windows-amd 64 安装包,也有解压版下载,如下图所示:

安装包图片

安装 Go 语言编辑器 LiteIDE

LiteIDE 是一个轻量级 Go 语言开发编辑器,下载 LiteIDE 安装包

下载并安装 Git

下载并安装 Git,通过 Git 获取驱动程序。

Git 安装步骤简单,持续点击【下一步】即可。安装完成后,在桌面单击鼠标右键,选择【Git Bash Here】按钮,出现下图即表明安装成功。

Git 安装成功

DM 驱动包的配置

  1. 安装 DM 驱动包

将提供的 DM 驱动包放在 GOPATH 的 src 目录下。驱动包位于 dmdbms/drivers/go/dm-go-driver.zip 解压到 GPPATH 安装路径的 src 下,如图所示:

安装dm驱动包

  1. 安装依赖包

所需 Go 依赖包有两个,textsnappy,从 Git 上把依赖包 clone 到本地,桌面右键【Git Bash Here】打开 Git 命令行窗口,依次下载 text 和 snappy 依赖。

1
2
git clone https://github.com/golang/text.git  D:/Go/src/golang.org/x/text
git clone https://github.com/golang/snappy D:/Go/src/github.com/golang/snappy

注意示例安装路径为 D:/Go 注意换成自己的安装路径。

clone 依赖包

clone 依赖包

绑定变量及大字段操作示例

打开 LiteIDE 编辑工具,新建一个目录,并在目录下新建一 TestDemo.go 文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*该例程实现插入数据,修改数据,删除数据,数据查询等基本操作。*/
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 = "D:\\三国演义.jpg"
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
}

注意提前在 D:\\三国演义.jpg 准备好要插入的大字段图片。

点击【build and run】按钮运行代码,运行截图如下:

运行后截图

运行后数据库截图如下图所示:

运行后数据库截图

参考资料


Golang开发达梦数据库应用
https://www.biuaxia.cn/2022/02/21/14/23/13.html
作者
biuaxia
发布于
2022年2月21日
许可协议