Golang + Oracle 11g + XORM + go-oci8 的數(shù)據(jù)庫驅(qū)動測試(超詳細(xì))

一、系統(tǒng)環(huán)境介紹:

  • Windows 10
  • Oracle 11g 64bit
  • OCI -> instantclient-basic-windows.x64-12.2.0.1.0
  • OCI SDK -> instantclient-sdk-windows.x64-12.1.0.2.0
  • MinGW 64bit
  • go1.11 windows/amd64

注意:我在Oracle 11g版本下使用 OCI 及 SDK 11.2.0.4.0版本會報錯,改用 OCI 12.2.0.1.0 及 SDK 12.1.0.2.0就可以了鹰霍。

二、安裝MinGW炊昆,注意安裝系統(tǒng)相應(yīng)的32/64位的版本

1、下載地址:

https://sourceforge.net/projects/mingw-w64/files/

2威根、安裝MinGW
  • 雙擊安裝程序


    雙擊安裝程序
  • 修改Architecture為:x86_64凤巨,點(diǎn)擊 Next > 直到安裝完成。注意:安裝路徑洛搀,后面需要用到
點(diǎn)擊 Next >
  • 安裝完成目錄結(jié)構(gòu)


    安裝完成
  • 設(shè)置環(huán)境變量Path敢茁,添加:D:\Tool\MinGW64\mingw64\bin
設(shè)置環(huán)境變量
復(fù)制位置

三留美、下載Oracle 的 OCI和SDK

1卷要、下載OCI和SDK

https://www.oracle.com/technetwork/topics/winx64soft-089540.html

下載OCI和SDK文件

2、創(chuàng)建存放目錄独榴,如:C:\instantclient_11_2,并將上面的兩個壓縮文件解壓到C:\instantclient_11_2中奕枝,如圖:
解壓的OCI和SDK
  • 設(shè)置環(huán)境變量Path棺榔,添加:C:\instantclient_11_2

    設(shè)置環(huán)境變量

  • D:\Tool\MinGW64\mingw64\lib\pkg-config目錄下新建:oci8.pc文件,pkg-config目錄也需要新建隘道。注意修改你的OCI目錄地址
    新建的目錄結(jié)構(gòu)

    目錄結(jié)構(gòu)

    修改oci8.pc中的OCI路徑C:\instantclient_11_2

# Package Information for pkg-config
prefix=C:/instantclient_11_2
exec_prefix=C:/instantclient_11_2
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}

設(shè)置環(huán)境變量PKG_CONFIG_PATH

image.png

四症歇、數(shù)據(jù)操作測試

測試文件main_test.go,測試前注意先添加userinfo表及數(shù)據(jù)

package main_test

import (
    "database/sql"
    "testing"

    "github.com/go-xorm/xorm"
    _ "github.com/mattn/go-oci8"
)

var driverName = "oci8" //Oracle 驅(qū)動
var dataSourceName = "ggs/123456@127.0.0.1:1521/ORCL"  //數(shù)據(jù)庫賬號:ggs谭梗,密碼:123456忘晤,實例服務(wù):ORCL
var engine *xorm.Engine

func TestXormOracle(t *testing.T) {
    var err error
    engine, err = xorm.NewEngine(driverName, dataSourceName)
    if err != nil {
        t.Error(err)
    }
    tabs, err := engine.DBMetas()
    if err != nil {
        t.Error(err)
    }
    println(len(tabs)) 
}

func TestMattnOracle(t *testing.T) {
    var db *sql.DB
    var err error
    if db, err = sql.Open(driverName, dataSourceName); err != nil {
        t.Error(err)
        return
    }
    var rows *sql.Rows
    if rows, err = db.Query("select * from userinfo"); err != nil {
        t.Error(err)
        return
    }
    defer rows.Close()
    for rows.Next() {
        var id int
        var name string
        rows.Scan(&id, &name)
        println(id, name) // 3.14 foo
    }
}

1、TestXormOracle測試
=== RUN   TestXormOracle
oracle
[{"Name":"DEMO","Type":null,"Indexes":{"SYS_C0013542":{"IsRegular":false,"Name":"SYS_C0013542","Type":2,"Cols":["ID"]}},"PrimaryKeys":[],"AutoIncrement":"","Created":{},"Updated":"","Deleted":"","Version":"","Cacher":null,"StoreEngine":"","Charset":"","Comment":""},{"Name":"USERINFO","Type":null,"Indexes":{"SYS_C0022579":{"IsRegular":false,"Name":"SYS_C0022579","Type":2,"Cols":["id"]}},"PrimaryKeys":[],"AutoIncrement":"","Created":{},"Updated":"","Deleted":"","Version":"","Cacher":null,"StoreEngine":"","Charset":"","Comment":""}]
--- PASS: TestXormOracle (0.14s)
PASS

Process finished with exit code 0
2激捏、TestMattnOracle測試
API server listening at: 127.0.0.1:63941
=== RUN   TestMattnOracle
1 張三
2 李四
--- PASS: TestMattnOracle (0.06s)
PASS

Debugger finished with exit code 2

五设塔、錯誤問題及解決方案

1、OCI版本不一致远舅,報錯的相關(guān)內(nèi)容:
In file included from D:/worktools/instantclient_11_2/sdk/include/oci.h:541, from ......\mattn\go-oci8\oci8.go:4: 
D:/worktools/instantclient_11_2/sdk/include/oratypes.h:236:25: error: expected ' =', ',', ';', 'asm' or 'attribute' before 'ubig_ora' typedef unsigned _int64 ubig_ora; ^~~~ 
D:/worktools/instantclient_11_2/sdk/include/oratypes.h:237:25: error: expected ' =', ',', ';', 'asm' or 'attribute' before 'sbig_ora' typedef signed _int64 sbig_ora; ^~~~ In file included from 
D:/worktools/instantclient_11_2/sdk/include/oci.h:3045, from ......\mattn\go-oci8\oci8.go:4: D:/worktools/instantclient_11_2/sdk/include/ociap.h:7459:40: error: unknown type name 'ubig_ora' OraText path, ubig_ora lenp ); ^~~~ 
D:/worktools/instantclient_11_2/sdk/include/ociap.h:7471:36: error: unknown type name 'ubig_ora' uword origin, ubig_ora offset, sb1 dir ); ^~~~ 
D:/worktools/instantclient_11_2/sdk/include/ociap.h:8278:23: error: unknown type name 'sbig_ora' sbig_ora bufferLength, sbig_ora returnLength, ^~~~ 
D:/worktools/instantclient_11_2/sdk/include/ociap.h:8278:46: error: unknown type name 'sbig_ora' sbig_ora bufferLength, sbig_ora returnLength

錯誤原因:OCI版本問題闰蛔,我是在Oracle 11g版本下使用 OCI 及 SDK 11.2.0.4.0版本會報錯
解決方法:改用 OCI 12.2.0.1.0 及 SDK 12.1.0.2.0就可以了痕钢。

2、fatal error: oci.h: No such file or directory
# github.com/mattn/go-oci8
/slview/nms/go/src/github.com/mattn/go-oci8/oci8.go:4:17: fatal error: oci.h: No such file or directory
 #include <oci.h>
                 ^
compilation terminated.

錯誤原因:D:\Tool\MinGW64\mingw64\lib\pkg-config\oci8.pc 配置文件中的路徑未修改
解決方法:修改oci8.pc中的路徑C:/instantclient_11_2為你的OCI存放路徑序六,如下:

# Package Information for pkg-config
prefix=C:/instantclient_11_2
exec_prefix=C:/instantclient_11_2
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}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末任连,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子例诀,更是在濱河造成了極大的恐慌随抠,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件繁涂,死亡現(xiàn)場離奇詭異拱她,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)爆土,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門椭懊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人步势,你說我怎么就攤上這事氧猬。” “怎么了坏瘩?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵盅抚,是天一觀的道長。 經(jīng)常有香客問我倔矾,道長妄均,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任哪自,我火速辦了婚禮丰包,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘壤巷。我一直安慰自己邑彪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布胧华。 她就那樣靜靜地躺著寄症,像睡著了一般。 火紅的嫁衣襯著肌膚如雪矩动。 梳的紋絲不亂的頭發(fā)上有巧,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音悲没,去河邊找鬼篮迎。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柑潦。 我是一名探鬼主播享言,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脆荷,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤程储,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年偏化,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镐侯。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡侦讨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出苟翻,到底是詐尸還是另有隱情韵卤,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布崇猫,位于F島的核電站沈条,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏诅炉。R本人自食惡果不足惜蜡歹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涕烧。 院中可真熱鬧月而,春花似錦、人聲如沸议纯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痹扇。三九已至,卻和暖如春溯香,著一層夾襖步出監(jiān)牢的瞬間鲫构,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工玫坛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留结笨,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像炕吸,于是被迫代替她去往敵國和親伐憾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容