• 使用go语言操作db2


    操作系统 : CentOS7.3.1611_x64

    go语言版本:1.8.3 linux/amd64

    db2版本: db2_v101_linuxx64_expc

    问题描述

    怎么使用go语言在CentOS环境下操作db2数据库?

    解决方案

    go语言操作数据库相关信息可以参考如下链接:

    https://github.com/golang/go/wiki/SQLDrivers

    使用db2cli

    db2cli地址: https://bitbucket.org/phiggins/go-db2-cli/src

    下载源码,并将源码放到如下路径:

    /usr/local/go/src/bitbucket.org/phiggins/go-db2-cli

    [root@localhost go-db2-cli]# pwd
    /usr/local/go/src/bitbucket.org/phiggins/go-db2-cli
    [root@localhost go-db2-cli]# ls
    LICENSE  mgodbc.go  README.md
    [root@localhost go-db2-cli]#

    这里直接使用bitbucket提供的示例代码 (db2test.go):

    package main
    // E-Mail : Mike_Zhang@live.com
    import (
        _ "bitbucket.org/phiggins/go-db2-cli"
        "database/sql"
        "flag"
        "fmt"
        "os"
        "time"
    )
    
    var (
        connStr = flag.String("conn", "", "connection string to use")
        repeat  = flag.Uint("repeat", 1, "number of times to repeat query")
    )
    
    func usage() {
        fmt.Fprintf(os.Stderr, `usage: %s [options]
    
    %s connects to DB2 and executes a simple SQL statement a configurable
    number of times.
    
    Here is a sample connection string:
    
    DATABASE=MYDBNAME; HOSTNAME=localhost; PORT=60000; PROTOCOL=TCPIP; UID=username; PWD=password;
    `, os.Args[0], os.Args[0])
        flag.PrintDefaults()
        os.Exit(1)
    }
    
    func execQuery(st *sql.Stmt) error {
        rows, err := st.Query()
        if err != nil {
            return err
        }
        defer rows.Close()
        for rows.Next() {
            var t time.Time
            err = rows.Scan(&t)
            if err != nil {
                return err
            }
            fmt.Printf("Time: %v
    ", t)
        }
        return rows.Err()
    }
    
    func dbOperations() error {
        db, err := sql.Open("db2-cli", *connStr)
        if err != nil {
            return err
        }
        defer db.Close()
        st, err := db.Prepare("select current timestamp from sysibm.sysdummy1")
        if err != nil {
            return err
        }
        defer st.Close()
    
        for i := 0; i < int(*repeat); i++ {
            err = execQuery(st)
            if err != nil {
                return err
            }
        }
        return nil
    }
    
    func main() {
        flag.Usage = usage
        flag.Parse()
        if *connStr == "" {
            fmt.Fprintln(os.Stderr, "-conn is required")
            flag.Usage()
        }
    
        if err := dbOperations(); err != nil {
            fmt.Fprintln(os.Stderr, err)
        }
    }
    [root@localhost db2Test]# ls
    build.sh  db2Test.go  run.sh
    [root@localhost db2Test]# ./build.sh
    [root@localhost db2Test]# ./run.sh
    Time: 2017-09-25 22:41:21.701142 +0000 UTC
    [root@localhost db2Test]#

    build.sh :

    #!/bin/bash
    
    DB2HOME=/home/db2inst1/sqllib
    export CGO_LDFLAGS=-L$DB2HOME/lib
    export CGO_CFLAGS=-I$DB2HOME/include
    
    go build db2Test.go

    run.sh :

    #! /bin/bash
    
    DB2HOME=/home/db2inst1/sqllib
    export LD_LIBRARY_PATH=$DB2HOME/lib
    
    ./db2Test -conn 'DATABASE=testdb; HOSTNAME=127.0.0.1; PORT=50000; PROTOCOL=TCPIP; UID=db2inst1; PWD=123456;'

    好,就这些了,希望对你有帮助。

    本文github地址:

    https://github.com/mike-zhang/mikeBlogEssays/blob/master/2017/20171202_使用go语言操作db2.rst

    欢迎补充

  • 相关阅读:
    Android系统Recovery工作原理2update.zip差分包问题的解决
    学习 原理图1 认识 元器件
    ARM新GPU架构Midgard
    ARM新GPU架构Midgard
    10种图片防盗链的方法
    一个基于PDO的数据库操作类(新) + 一个PDO事务实例
    localhost与127.0.0.1的区别
    header ContentType类型
    PHP采集利器:Snoopy 试用心得
    一个简单易用的导出Excel类
  • 原文地址:https://www.cnblogs.com/MikeZhang/p/goOptIBMDB20171202.html
Copyright © 2020-2023  润新知