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_1\sdk下。
    在instantclient_11_1下建立\network\admin\目錄,添加tnsnames.ora(這個就不解釋了吧),內容根據自己的orcale設置。

三、配置go-oci8

    直接go get github.com/wendal/go-oci8(報錯不用管),然后到go\src\github.com/wendal\go-oci8\windows下,將pkg-config.exe拷貝到MinGW\bin下,將oci8.pc復制到MinGW\lib\pkg-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和mingw\bin的路徑
    添加PKG_CONFIG_PATH=C:\mingw\lib\pkg-config
    添加TNS_ADMIN=F:\dev\instantclient_11_1\network\admin\

五、測試

    在此執行go get github.com/wendal/go-oci8,如果沒錯那說明大功告成。具體測試代碼見github.com\wendal\go-oci8\example下的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()
}

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM