Go语言连接Oracle(就我这个最全)
综合参考了网上挺多的方案
倒腾了半天终于连接好了
go都出来这么多年了
还没有个oracle的官方驱动。。。
过程真的很蛋疼。。一度想放弃直接连odbc
首先交代一下运行环境和工具版本:
win10
mingw64
oracle instancclient_18_3 x64
jetbrins goland
看完这篇文章,你可以解决如下问题(正经的解决):
编译阶段:
1. exec: "gcc": executable file not found in %path%
2. exec: "pkg-config": executable file not found in %path%
3. cannot use (**_ctype_struct_ociserver)(unsafe.pointer(&conn.svc))
(type **_ctype_struct_ociserver) as type **_ctype_struct_ocisvcctx
in argument to func literal
运行阶段:
1. process finished with exit code -1073741701 (0xc000007b)
2. exit status 3221225595
开始
一、下载oracle instancclient 和对应的sdk
下载地址:https://www.oracle.com/technetwork/topics/winx64soft-089540.html
我选用了18.3 x64的版本,能向下兼容,不用担心
注意basic版本和sdk都需要下载下来,一共是两个文件
下载之后先解压basic压缩包,然后将sdk解压到basic目录下:
添加如下环境变量到系统path变量:(按自己的情况添加)
二、下载安装mingw64
主要是解决win中没有gcc的问题
如果不安装后期会出现问题:(exec: "gcc": executable file not found in %path%)
因为之前下载的oracle instancclient是64位的所以我们也需要下载mingw64才能编译
下载地址:https://sourceforge.net/projects/mingw-w64/files/
注意,第一个是在线安装程序,较慢,建议直接下载7z压缩包。解压即可
解压之后,添加如下环境变量到path:(按自己的情况添加)
三、获取go-oci8驱动
执行命令:go get github.com/wendal/go-oci8
会报一个错误:pkg-config: exec: "pkg-config": executable file not found in %path%
先忽略,后面会解决
四、修改oci8.pc
进入gopath目录,找到oci8.pc文件,打开,修改 红色框的部分(按你自己的情况)
%gopath%\src\github.com\wendal\go-oci8\windows
然后:
1.复制此目录下pkg-config.exe到mingw64下的bin目录
2.复制此目录下oci8.pc到mingw64下的lib/pkg-config目录(pkg-config目录需要自己建)
添加如下(pkg_config_path)环境变量:(按自己情况)
五、最后一步
执行命令:go get github.com/wendal/go-oci8
此时执行这个操作
应该已经没有(pkg-config: exec: "pkg-config": executable file not found in %path%)这个错误了,如果还有,就是上一步你做的不太对。
但是,还会有新的错误出现,如下:
不要慌
打开gopath目录下,oci8.go文件
路径:%gopath%\src\github.com\wendal\go-oci8
此文件中四处ociserver为ocisvcctx
再次!!!!
执行命令:go get github.com/wendal/go-oci8
可以了,完事儿。
让我们上一段代码,测试一下:
package main import ( "database/sql" "fmt" "log" "os" _ "github.com/wendal/go-oci8" ) func query() { os.setenv("nls_lang", "american_america.al32utf8") log.setflags(log.lshortfile | log.lstdflags) db, err := sql.open("oci8", "j1_bibox/oracle123@10.1.196.200:1521/zjdevdb") if err != nil { log.fatal(err) } defer db.close() rows, err := db.query("select * from v$version") if err != nil { log.fatal(err) } cols, _ := rows.columns() rawresult := make([][]byte, len(cols)) result := make([]string, len(cols)) dest := make([]interface{}, len(cols)) for i := range rawresult { dest[i] = &rawresult[i] } for rows.next() { err = rows.scan(dest...) for i, raw := range rawresult { if raw == nil { result[i] = "" } else { result[i] = string(raw) } } fmt.printf("%s\n", result[0]) } rows.close() } func main() { query() }
走你
就是这么刺激,还是错!!!!?????
现在不要慌,冷静一点,分析情况
首先,如果你的代码在ide中运行,会报错如下:
如果你不信这个邪,在cmd中运行,会报错如下:
然后你拿着报错信息,去找度娘,有人会告诉你,你的instanceclient版本不对,然后你就不停的换版本,换版本,换版本
然后发现卵用没有
对,那个人就是我,=_=???????
现在!!我现在!!告诉你!!
真相只有一个!!!!!!!!
那就是:以管理员模式运行
来到这,无数次失败,无数次尝试最后获得成功的激动,瞬间就把你点燃。
恐怕这就是计算机世界吸引我的地方吧。
ide中也可以这样解决问题:
最后的最后,让我们给这段代码加个注释:
最后的最后的最后,如有指教,请留言。