在我们的开发场景下虽然大部分我们都使用mysql就可以满足我们日常的开发任务,但是总有一些开发场景是需要我们是用oracle数据库的,今天我给大家带来golang的俩种连接oracle的方式。
oracle简介
oracle也是出自甲骨文公司,和mysql同门,也是全球最大的信息管理软件及服务供应商,Oracle开发的关系数据库产品因性能卓越而闻名,Oracle数据库产品为财富排行榜上的前1000家公司所采用,许多大型网站也选用了Oracle系统,是世界最好的数据库产品。 mysql与oracle都是关系型数据库,应用于各种平台。mysql开源免费的,而oracle则是收费的,并且价格非常高
前置条件
golang连接Oracle 需要安装Oracle Full Client或Instant Client的驱动程序 Oracle的Instant
#选择Instant Client for Linux x86-64下载包如下:
instantclient-basic-linux.x64-21.1.0.0.0.zip
instantclient-sqlplus-linux.x64-21.1.0.0.0.zip
instantclient-sdk-linux.x64-21.1.0.0.0.zip
#都解压到 instantclient_21_1 这个目录,直接解压会解压到instantclient_21_1目录
unzip instantclient-basic-linux.x64-21.1.0.0.0.zip
unzip instantclient-sdk-linux.x64-21.1.0.0.0.zip
unzip instantclient-sqlplus-linux.x64-21.1.0.0.0.zip
#打印instantclient_21_1目录的路径
pwd
/home/oracle/instantclient_21_1
安装pkg-config
#centos自带了pkg-config
pkg-config -version
创建配置文件oci8.pc
vim/home/oracle/oci8.pc
prefix=/home/oracle/instantclient_21_1
libdir=${prefix}
includedir=${prefix}/sdk/include/
glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums
Name: oci8
Description: oci8 library
Libs: -L${libdir} -lclntsh
Cflags: -I${includedir}
Version: 21.1
环境变量配置
vim /etc/profile
# Oracle的OCI套件
export LD_LIBRARY_PATH=/home/oracle/instantclient_21_1
# oci8.pc文件所在路径
export PKG_CONFIG_PATH=/home/oracle
使配置生效
source /etc/profile
完成以上操作就可以进行做连接了~ 第一种方式
//使用go get github.com/mattn/go-oci8
//在GoPath的src目录下创建oracleoci8.go
package main
import (
"database/sql"
"fmt"
_ "github.com/mattn/go-oci8"
"log"
"os"
)
func main() {
if len(os.Args) != 2 {
log.Fatalln(os.Args[0] + " user/password@host:port/sid")
}
fmt.Println(os.Args[1])
db, err := sql.Open("oci8", os.Args[1])
if err != nil {
log.Fatalln(err)
}
defer db.Close()
//查询用户
rows, err := db.Query("select user from dual")
if err != nil {
log.Fatalln(err)
}
defer rows.Close()
for rows.Next() {
var data string
rows.Scan(&data)
fmt.Println(data)
}
if err = rows.Err(); err != nil {
log.Fatalln(err)
}
//查询ZHUJI表的code字段
rows2, err := db.Query("SELECT code FROM ZHUJI")
if err != nil {
log.Fatalln(err)
}
defer rows2.Close()
for rows2.Next() {
var data string
rows2.Scan(&data)
fmt.Println(data)
}
if err = rows2.Err(); err != nil {
log.Fatalln(err)
}
}
运行该代码
#直接运行
go run oracleoci8.go liang/[email protected]:1521/orcl
#或者先编译成二进制,在运行二进制文件
go build oracleoci8.go
./oracleoci8 liang/[email protected]:1521/orcl
第二种方式
//使用go get github.com/godror/godror
//在GoPath的src目录下创建oracledror.go
package main
import (
"database/sql"
"encoding/json"
"fmt"
_ "github.com/godror/godror"
)
func main() {
db, err := sql.Open("godror", `user="liang" password="liang" connectString="192.168.0.4:1521/orcl"`)
if err != nil {
panic(err)
}
err = db.Ping()
if err != nil {
panic(err)
}
//查询ZHUJI表中code='pt'的sql:SELECT * FROM ZHUJI where CODE = 'pt'
sqlStatement := "SELECT * FROM ZHUJI where CODE = :1"
stmt, err := db.Prepare(sqlStatement)
defer stmt.Close()
if err != nil {
panic(err)
}
rows, err := stmt.Query("pt") //输入sql中对应参数的值
if err != nil {
panic(err)
}
defer rows.Close() //defer关闭查询连接
//获取列相关信息
strings, _ := rows.Columns()
for i := 0; i < len(strings); i++ {
fmt.Print(" ", strings[i])
}
fmt.Print("\n")
//构造切片存储json
var slice []map[string]interface{}
var m1 map[string]interface{}
m1 = make(map[string]interface{})
var CODE, OVALUE1, OVALUE2 string
for rows.Next() {
rows.Scan(&CODE, &OVALUE1, &OVALUE2) //写入查询数据集的所有列名称
fmt.Printf("code is %s, OVALUE1 is %s\n", CODE, OVALUE1)
m1["CODE"] = CODE
m1["OVALUE1"] = OVALUE1
m1["OVALUE2"] = OVALUE2
slice = append(slice, m1) //分片中追加信息
}
if err = rows.Err(); err != nil {
// handle the error here
}
defer stmt.Close()
data, err := json.Marshal(slice)
if err != nil {
fmt.Printf("序列化错误 err = %v\n", err)
}
//输出序列化后的结果 json字符串
fmt.Printf("序列化后 = %v\n", string(data))
}
运行
#直接运行
go run oracledror.go
#或者先编译成二进制,在运行二进制文件
go build oracledror.go
./oracledror
以上就是golang的俩种连接oracle数据库的方式。
标签:rows,nil,err,instantclient,golang,go,fgolang,oracle From: https://blog.51cto.com/yuanmouren/7640052