这里使用官方包databse/sql
也可使用其他二次封装包,例如:github.com/jmoiron/sqlx
连接
package utilities
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
_ "github.com/godror/godror"
)
var db *sql.DB
type connect struct {
HOST string
PORT string
DATABASE string
USERNAME string
PASSWORD string
CHARSET string
PARSETIME string
SID string
}
func Mysql()(baseDB *sql.DB, err error) {
mysql := connect{
HOST: "localhost",
PORT: "3306",
DATABASE: "dream",
USERNAME: "root",
PASSWORD: "root",
CHARSET: "utf8mb4",
PARSETIME: "True",
}
driver := mysql.USERNAME+":"+mysql.PASSWORD+"@"+"tcp("+mysql.HOST+":"+mysql.PORT+")/"+mysql.DATABASE+"?charset="+mysql.CHARSET
if mysql.PARSETIME != "" {
driver += "&parseTime="+mysql.PARSETIME
}
db, err = sql.Open("mysql",driver)
if err != nil {
fmt.Printf("connect DB failed, err:%v\n", err)
return
}
db.SetMaxOpenConns(20)
db.SetMaxIdleConns(10)
return db,nil
}
func Oracle()(baseDB *sql.DB, err error){
oracle := connect{
HOST: "localhost",
PORT: "1521",
USERNAME: "root",
PASSWORD: "root",
SID: "orcl",
}
db, err := sql.Open("godror",`user="`+oracle.USERNAME+`" password="`+oracle.PASSWORD+`" connectString="`+oracle.HOST+`:`+oracle.PORT+`/`+oracle.SID+`"`)
if err != nil {
fmt.Printf("connect DB failed, err:%v\n", err)
return
}
db.SetMaxOpenConns(20)
db.SetMaxIdleConns(10)
return db,nil
}
声明一个connect结构体来存储连接属性,声明一个db指针指向连接
Mysql: 不要忘记引入mysql驱动
Oracle 官方包比较麻烦,我使用第三方包:godror做驱动包,Oracle连接三步骤:
一.Win下建立新版GCC
windows下需要安装一个新版的gcc,谷歌MinGW
下载自己的对应版本(32,64),有两种下载方式,安装包与压缩包,因被墙下载过慢我把下载好的8.1版本gcc放到网盘上
链接:https://pan.baidu.com/s/1X-yRygLtHfgPTTBbyLNDTQ 提取码:c80z
解压后进入bin目录将该路径配置到环境变量上,打开cmd
,输入 gcc -v
查看是否成功:
二. 安装oracle即时客户端
我连接远程oracle,不需要本地客户端,下载一个简易客户端连接包:Instant Client
(https://oracle.github.io/odpi/doc/installation.html) ,同样是解压包,按官方提示解压后配进环境变量。
三. 引入驱动
重启GO编辑器,go get github.com/godror/godror
下载godror驱动,尝试连接
import引入驱动:_ "github.com/godror/godror"
连接:
db, err := sql.Open("godror", `user="scott" password="tiger" connectString="dbhost:1521/orclpdb1"`)
----------------------------------------------------
处理sql结果集
package orm
import (
"utilities"
"database/sql"
"fmt"
)
func query(sqlStr string,db *sql.DB)(list []map[string]string) {
rows,_ := db.Query(sqlStr)
//字段名称
columns, _ := rows.Columns()
//多少个字段
length := len(columns)
//每一行字段的值
values := make([]sql.RawBytes, length)
//保存的是values的内存地址
pointer := make([]interface{}, length)
//
for i := 0; i < length; i++ {
pointer[i] = &values[i]
}
//
for rows.Next() {
//把参数展开,把每一行的值存到指定的内存地址去,循环覆盖,values也就跟着被赋值了
err := rows.Scan(pointer...)
if err != nil {
fmt.Println(err)
return
}
//每一行
row := make(map[string]string)
for i := 0; i < length; i++ {
row[columns[i]] = string(values[i])
}
list = append(list, row)
}
_ = rows.Close()
return
}
func GetMysqlData(sqlStr string)(list []map[string]string) {
db, err := utilities.Mysql()
if err != nil {
fmt.Println(err)
return
}
return query(sqlStr, db)
}
func GetOracleData(sqlStr string)(list []map[string]string) {
db, err := utilities.Oracle()
if err != nil {
fmt.Println(err)
return
}
return query(sqlStr, db)
}
将结果集转换为map类型的切片,分别指定Oracle与Mysql的连接返回,如想要转换为结构体 可使用github.com/jmoiron/sqlx
包,注意此处的utilities包是我的自定义包,内部方法为上方的连接。