使用golang链接达梦数据库

Go DM 数据库驱动介绍

Go 语言标准库 database/sql(https://golang.google.cn/pkg/database/sql/)提供了一系列数据库操作的标准接口,DM 数据库基于 GO1.13 版本通过实现 database/sql 包的接口,向开发人员提供 DM 数据库操作的 Go 语言接口。

环境准备

  • 达梦安装后在安装目录的drivers下有go目录,该目录下面的dm-go-driver.zip

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8rqCjLoV-1648908140731)(images/i3y8cnkDoLzz4VGbbt5tnrAx_m5oTi0t0ok8-5pNdYg.png)]

  • 建立go工程
[root@vmpc ~]# mkdir go_dm8
[root@vmpc ~]# cd go_dm8/
[root@vmpc go_dm8]# mkdir src
[root@vmpc go_dm8]# cd src/
[root@vmpc src]# mkdir app
[root@vmpc src]# cd app

vim main.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 = "sanguo.txt"
        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
}

/* 修改产品信息表数据 */
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 = 11;"
        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
}

将解压后的dm-go-driver.zip后的达梦go驱动放入工程目录

[root@vmpc dm8]# unzip dm-go-driver.zip
[root@vmpc dm8]# mv dm ../go_dm8/src/

设置环境变量

[root@vmpc go_dm8]# export GOPATH=/root/go_dm8
[root@vmpc go_dm8]# export GO111MODULE="off"

手工下载** golang.org/x/text **

[root@vmpc go_dm8]# mkdir -p $GOPATH/src/golang.org/x/
[root@vmpc go_dm8]# cd $GOPATH/src/golang.org/x/
[root@vmpc x]# git clone https://github.com/golang/text.git

编译项目

[root@vmpc x]# cd $GOPATH
[root@vmpc go_dm8]# go get app
[root@vmpc go_dm8]# go install app

目录结构

[root@vmpc go_dm8]# tree -L 2
.
├── bin
│   ├── app
│   └── sanguo.txt
└── src
    ├── app
    ├── dm
    ├── github.com
    └── golang.org

6 directories, 2 files
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在Linux上连接达梦数据库,可以使用Go语言的database/sql包提供的接口来实现。通过引用了解到,DM数据库基于GO语言的database/sql包的接口进行开发。因此,需要先准备好以下环境: - DM数据库 8.0及以上版本 - Go语言 1.17.8版本 安装达梦数据库可以参考中的指南。DM数据库管理系统是一款具有完全自主知识产权的高性能数据库管理系统。DM8版本采用全新的体系架构,在性能、可靠性、海量数据处理和安全性方面进行了大量研发和改进工作,能同时满足OLTP和OLAP请求,并提升了产品的品质。 在CentOS 7环境下运行可能会报错"unrecognized relocation (0x2a) in section `.text'",可以参考中的Q&A寻找解决方案。 要连接达梦数据库,可以使用以下步骤: 1. 导入所需的包:import "database/sql"和import _ "github.com/dm/mysql" 2. 创建数据库连接:db, err := sql.Open("dm", "用户名:密码@地址:端口/数据库名") 3. 检查连接错误:if err != nil {panic(err)} 4. 执行SQL语句:使用db.Exec()方法执行所需的SQL语句,例如插入、更新、查询、删除等操作。 5. 关闭数据库连接:defer db.Close() 请注意,以上步骤仅供参考,具体的实现可能会根据你的需求和代码结构有所不同。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [linux下go语言连接达梦数据库](https://blog.csdn.net/qq_35349982/article/details/129800478)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [linux下达梦数据库安装与使用](https://blog.csdn.net/xz060585/article/details/126647745)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏 克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值