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() }
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
