• go orcale


    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_1 etworkadmin

    五、测试

        在此执行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()
    }
    复制代码
     
     
    分类: golang
    标签: golanggoorcaleoci
  • 相关阅读:
    hdoj1587
    欧拉定理及其应用
    hdoj1571
    hdoj1050
    POJ推荐50题
    poj2593
    hdoj1286
    hdoj1215七夕节
    我的Linux软件
    ACM题目推荐--《算法艺术与信息学竞赛》(转)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3793002.html
Copyright © 2020-2023  润新知