golang操作数据库
在golang中操作非关系型数据库(redis)和关系型数据库(mysql、oracle)。
首先是下载数据库驱动包,因为墙的缘故,可能下载驱动包会有超时连接失败的情况,可以将镜像站点设为国内知名站点
阿里云站点:
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/
GitHub国内镜像:
go env -w GOPROXY=https://goproxy.io,direct
操作redis:
下载驱动包
go get -u github.com/gomodule/redigo/redis
开启redis服务端,代码里导入redis依赖即可,代码示例:
package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
)
var pool *redis.Pool
func init() {
pool = &redis.Pool{
MaxIdle: 8,
MaxActive: 0,
IdleTimeout: 100,
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", "localhost:6379")
},
}
}
func main() {
conn := pool.Get()
defer conn.Close()
_, err := conn.Do("MSet", "name", "stu", "hobby", "coding")
if err != nil {
panic(err)
}
s, err := redis.String(conn.Do("Get", "name"))
if err != nil {
panic(err)
}
_, err = conn.Do("del", "name")
if err != nil {
panic(err)
}
fmt.Println(s)
}
操作mysql
下载驱动包
go get -u github.com/go-sql-driver/mysql
同样导入依赖即可,代码示例
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func main() {
open, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/zt?parseTime=true")
if err != nil {
panic(err)
}
defer open.Close()
query, err := open.Query("select id,user_id,depart_id,tenant_id from zt.base_depart_user")
if err != nil {
panic(err)
}
fmt.Println(query)
for query.Next() {
var id string
var userId sql.NullString
var departId sql.NullString
var tenantId string
err := query.Scan(&id,&userId,&departId,&tenantId)
if err != nil {
panic(err)
}
fmt.Printf("id=%v userId=%v departId=%v tenantId=%v \n", id, userId, departId, tenantId)
}
query.Close()
}
操作oracle,驱动使用godror,同时需要注意的是oracle的占位符是“:name”的形式
下载驱动包
go get github.com/godror/godror
db, err := sql.Open("godror", "DJJGK/DJJGK@172.xx.xx.xx:1521/orcl")
if err != nil {
panic(err)
}
defer db.Close()
事务
func (db *DB) Begin() (*Tx, error)
//开启事务tx,若后续任何操作有出错,则回滚
tx, err := db.Begin()
if err != nil {
panic(err)
}
sql := "UPDATE table SET name=x WHERE id=10"
stmt, err := tx.Prepare(sql)
defer stmt.Close()
if err != nil {
tx.Rollback() //回滚
panic(err)
}
_, err = stmt.Exec(x, 10)
if err != nil {
tx.Rollback() //回滚
panic(err)
}
tx.Commit() //提交
浙公网安备 33010602011771号