Golang實踐錄 oracle資料庫實踐

2021-10-25 02:45:24 字數 3359 閱讀 4598

本文在 windows 7 64bit 系統上使用 golang 連線查詢 oracle 資料庫。

前置條件:

安裝mingw(取其gcc及庫,因為要用cgo編譯),安裝git(取其bash)。安裝oci。

pkg_config_path環境變數 (失敗)

d:\mingw64\lib\pkg-config
執行echo $pkg_config_path檢視目錄,對映到 e:\program files\git\mingw64\lib 下,不存在pkgconfig,建立之。

1、獲取oci8.pc。執行:

再次執行:

collect2.exe: error: ld returned 1 exit status一說:把oci8.pc檔案的lclntsh改為oci,修改後,再執行,通過。得到pkg\windows_amd64\github.com\wendal\go-oci8.a目錄。

go get github.com/mattn/go-oci8
對比兩者原始碼和生成的.a檔案,mattn的檔案也多,庫也比較大。但對比使用者而言無區別。為安全起見,實際工程使用 mattn 庫。

3、oci8.pc內容:

#prefix=d:/oracle/instantclient

includedir=d:/oracle/instantclient/sdk/include

libdir=d:/oracle/instantclient/sdk/lib/msvc

name: oci8

description: oracle instant client

version: 19.8

cflags: -i$

libs: -l$ -loci

注:使用全路徑,不使用prefix(因為git安裝的目錄帶有空格),將庫修改為oci。

4、編寫測試**。go build 出錯:

# command-line-arguments

d:\go\pkg\tool\windows_amd64\link.exe: running gcc failed: exit status 1

d:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -loci

collect2.exe: error: ld returned 1 exit status

猜想:官方oci是.lib格式,gcc不認。而golang的驅動得到.a但沒有包括oci裡面的函式。將得到的go-oci8.a改名為liboci.a,再次go build,提示未定義的函式,用nm查之,函式前為u,猜測格式不對。

$ pkg-config --cflags -- oci8

-id:/oracle/instantclient/sdk/include

d:\oracle\instantclient目錄找oci.dll,放到臨時目錄。從dll生成.a。

* [oci.dll] found pe image

$ dlltool.exe -d oci.dll -d oci.def -l liboci.a # 從dll和def生成.a檔案。

生成的檔案為liboci.a,可用nm查函式,已有定義。將其放到mingw的lib目錄(這樣就不用再額外設定路徑),本文為 d:\mingw64\lib 。

5、疑惑1:

似乎golang生成的go-oci8.a沒什麼用,可能內部鏈結了裡面的函式,但最終的oci函式,還是從官方的oci庫中獲取,如ocistmtprepare。

疑惑2:

go get github.com/mattn/go-oci8處,會使用pc檔案指定的引數,但似乎只針對標頭檔案,也沒有鏈結,具體未詳細研究(因為.lib和.a格式已然不同,不通用,鏈結不上的,沒報錯,應該沒鏈結)。

package main

import (

"database/sql"

"log"

"errors"

// 匯入mysql驅動

}

參考資料:

Golang實踐錄 測試框架

這篇集中記錄一下測試相關的內容。建立工程庫 方便重用。重用方式可使用函式,也可直接引用檔案。完成函式,可在 main 函式中呼叫進行測試。也可以使用 test 框架進行。在大型專案中,可以用 test 進行測試更方便,即不影響業務 也保留測試 測試檔案形式為 檔名 test.go,原始碼檔案不能以 ...

golang 併發實踐

golang 高併發主要是依靠sync包下的api實現,首先就是waitgroup 先說說waitgroup的用途 它能夠一直等到所有的goroutine執行完成,並且阻塞主線程的執行,直到所有的goroutine執行完成。waitgroup總共有三個方法 add delta int done wa...

nodejs實踐錄 開篇

筆者從事c開發很多年了,不太想跨語言開發,不過,因為工作的關係,需要使用nodejs進行後台開發。一來是工作,二來多了解乙個新語言,總歸是有好處。經過一段時間加強訓練,了解了nodejs一點皮毛,發現解釋型語言與編譯型語言的異同,對自己的知識框架有一定提高。更重要的,可以以nodejs為切入點,進行...