分享
  1. 首页
  2. 文章

golang连接orcale

good-temper · · 9322 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

使用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()
}


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:good-temper

查看原文:golang连接orcale

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
9322 次点击
上一篇:go语言
1 回复 | 直到 2025年05月15日 08:50:24
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏