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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

