当前位置: 首页 > 工具软件 > next-go > 使用案例 >

DM8数据库驱动介绍-golang版

柯栋
2023-12-01

DM8基本安装

达梦数据库(DM8)的安装这里就不多介绍了,可以通过图形化界面进行安装,也可以通过命令行进行安装,个人觉得通过命令行安装比较方便。这里给出在CentOS7/中标麒麟v7系统中的基本步骤:

> su root
> mount -o loop /opt/dm8_setup.iso /mnt

# 开始安装
> su - dmdba
> cd /mnt
> ./DMInstall.bin -i
# 根据提示进行选择,可以选择默认项,安装路径选择已经授予dmdba用户权限的/dm8目录
# 命令行安装完后
> su root
# 此步为安装DMAP服务
> /dm8/script/root/root_installer.sh

> su - dmdba
> cd /dm8/bin
# 可以通过过 ./dminit help 查看支持的选项
> ./dminit PATH=/dm8/data DB_NAME=DM01 INSTANCE_NAME=DM01 PORT_NUM=5236 SYSDBA_PWD=dameng123

## 注册系统服务
> su root
> /dm8/script/root/dm_service_installer.sh -t dmserver -dm_ini /dm8/data/DM01/dm.ini -p DM01
> systemctl enable DmServiceDM01
> systemctl status DmServiceDM01
> systemctl start DmServiceDM01
# 到此,DM8数据库安装和实例初始化基本完成

golang驱动配置

  1. DM8提供了go语言的驱动包,路径:/dm8/drivers/go/dm-go-driver.zip,将该驱动包解压复制到$GOPATH/src目录下。
  2. 安装其它依赖包
go get golang.org/x/text
go get github.com/golang/snappy
  1. 连接字符串设置
dm://sysdba:dameng123@localhost:5236?socketTimeout=10&logLevel=info&schema=TEST
  • 参数说明:
    • socketTimeout: 连接的超时时间
    • logLevel:记录日志等级
    • schema:指定连接后的模式

如果需要查看所有的参数设置,可以查看DM8的程序员手册。

  1. 创建数据库连接
/* 创建数据库连接 */
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
}
  1. 增删改查操作
// insert
func insertTable() error {
	var inFileName = "c:\\三国演义.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, "9787101046121", 10, 19.0000, 15.2000,
	8.0,
	"《三国演义》是中国第一部长篇章回体小说,中国小说由短篇发展至长篇的原因与说书有关。
	",
	data, "25", 943, 93000, t2, t3)
	if err != nil {
		return err
	}
	fmt.Println("insertTable succeed")
	return nil
}

// update
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
}

// query
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
}

// delete
func deleteTable() error {
	var sql = "DELETE FROM production.product WHERE productid = 11;"
	if _, err := db.Exec(sql); err != nil {
		return err
	}
	fmt.Println("deleteTable succeed")
	return nil
}

  1. 完整示例
/*该例程实现插入数据,修改数据,删除数据,数据查询等基本操作。*/
package main
// 引入相关包
import (
	"database/sql"
	"dm"
	"fmt"
	"io/ioutil"
	"time"
)
var db *sql.DB
var err error
func main() {
	driverName := "dm"
	dataSourceName := "dm://sysdba:dameng123@localhost:5236?socketTimeout=10&logLevel=info&schema=TEST"
	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
	}
}

最后

DM8作为国产数据库,感觉还是不错的,跟其它主流的数据库使用上差别也不算很大。对于其它开发语言也提供了一些驱动包,比如ODBC,JDBC,.NET Data Provider,DM PHP,DM Node.js等,对开发来说相对友好。
仅以此博文记录一下有关DM8的开始学习使用过程,抛砖引玉,希望国产数据库发展得越来越好。


 类似资料: