• golang连接orcale


        使用glang有一段时间了,最开始其实并不太喜欢他的语法,但是后来熟悉之后发现用起来还挺爽的。之前数据库一直使用mysql,连接起来没有什么问题,github上有很多完善的驱动,所以以为连接其他数据库也应该没什么问题,近日听说其连接orcale比较麻烦,所以就试了试。

        之所以连接orcale比较麻烦是因为orcale并没有提供golang的驱动,所以并不能像java那样引入个驱动包就能连接,也不能像mysql之类的开源数据库可以自己实现驱动。不过正所谓天无绝人之路,既然纯go实现不了,那么还可以用cgo实现,c语言总该支持了吧。
        网上有很多方法,不过都是使用oci实现的,这里我们使用go-oci8(https://github.com/wendal/go-oci8)

    一、安装MinGW

        首先我们先来配置环境,由于cgo需要gcc支持,所以需要配置gcc环境,如果是linux下一般可以跳过该步骤,win下则需要自己安装了,这里我们使用MinGW,可以到官网现下载,不过官网直接提供的安装程序需要安装时联网下载,很可能会失败,所以几经搜索之后找到如下网址:

    •  MinGW下载地址相关:http://blog.csdn.net/mecho/article/details/24305369

        里边详细介绍了MinGW各版本的不同,可根据自己情况下载,由于我是64位,这里下载64位的POSIX版本
        具体的安装过程就不费话了,直接解压即可。

    二、安装OCI

        由于没有对应驱动包,我们不能直接连接,所以需要通过orcale提供OCI接口(有点像odbc),里边包含需要的类库。下载直接官网就行,找到系统对应版本:

    • oci下载地址:http://www.oracle.com/technetwork/topics/winsoft-085727.html

        需下载Basic和SDK,下载后解压Basic到instantclient_11_1,然后将SDK解压到instantclient_11_1sdk下。
        在instantclient_11_1下建立 etworkadmin目录,添加tnsnames.ora(这个就不解释了吧),内容根据自己的orcale设置。

    三、配置go-oci8

        直接go get github.com/wendal/go-oci8(报错不用管),然后到gosrcgithub.com/wendalgo-oci8windows下,将pkg-config.exe拷贝到MinGWin下,将oci8.pc复制到MinGWlibpkg-config下,并且编辑oci8.pc

    # Package Information for pkg-config
    prefix=修改为instantclient_11_1目录,如F:/dev/instantclient_11_1
    exec_prefix=修改为instantclient_11_1目录,如F:/dev/instantclient_11_1
    libdir=${exec_prefix}
    includedir=${prefix}/sdk/include/
    
    Name: OCI
    Description: Oracle database engine
    Version: 11.2
    Libs: -L${libdir} -loci
    Libs.private: 
    Cflags: -I${includedir}

    四、设置环境变量

        环境变量path下添加instantclient_11_1和mingwin的路径
        添加PKG_CONFIG_PATH=C:mingwlibpkg-config
        添加TNS_ADMIN=F:devinstantclient_11_1networkadmin

    五、测试

        在此执行go get github.com/wendal/go-oci8,如果没错那说明大功告成。具体测试代码见github.comwendalgo-oci8example下的oracle.go,注意要把里边import中的mattn改成wendal。一下是我的代码:

    package main
    import (
        "database/sql"
        _ "github.com/wendal/go-oci8"
        "log"
    )
    func query() {
        // 为log添加短文件名,方便查看行数
        log.SetFlags(log.Lshortfile | log.LstdFlags)
        // 用户名/密码@实例名  跟sqlplus的conn命令类似
        db, err := sql.Open("oci8", "username/pwd@ORCL")
        if err != nil {
            log.Fatal(err)
        }
        defer db.Close()
    
        rows, err := db.Query("select name from FUB_B")
        if err != nil {
            log.Fatal(err)
        }
    
        for rows.Next() {
            var name string
            rows.Scan(&name)
            log.Printf("Name = %s, len=%d", name, len(name))
        }
        rows.Close()
    }
    
    func update() {
        // 为log添加短文件名,方便查看行数
        log.SetFlags(log.Lshortfile | log.LstdFlags)
        // 用户名/密码@实例名  跟sqlplus的conn命令类似
        db, err := sql.Open("oci8", "username/pwd@ORCL")
        if err != nil {
            log.Fatal(err)
        }
        defer db.Close()
    
        stmt, _ := db.Prepare(`UPDATE FUB_B set name ='cnm'`)
        result, err := stmt.Exec()
        if err != nil {
            log.Fatal(err)
        }
        count, _ := result.RowsAffected()
        log.Printf("result count:%d", count)
    }
    
    func main() {
        update()
    }

     

  • 相关阅读:
    移动端UI
    jQuery 下拉框三级联动
    jQuery基础与学习资源
    jQuery
    TCP、UDP、HTTP、SOCKET之间的区别
    Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
    android 中 任务、进程和线程的区别
    android中不同手机分辨率适配问题
    经验分享:CSS浮动(float,clear)通俗讲解(真的很通俗)
    关于各种排列组合java算法
  • 原文地址:https://www.cnblogs.com/good-temper/p/3791874.html
Copyright © 2020-2023  润新知