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() //提交