痛点

  • database/sql 标准库提供了 mysql 的连接池 难用
  • redigo 第三方库提供了 redis 的连接池 难用
  • golang-db 封装了上述两个库 特别适合脚本开发场景

golang 访问 mysql、redis 是最为常见的场景,如果要写个脚本做些简单的事情,标准库和三方库都很复杂,容易出错。

本人从一线开发中的经验出发,简单封装了 mysql、redis 的连接池库而来的 golang-db,特别适合脚本开发场景。

让 golang 读写 mysql redis 如动态语言一样丝滑,也希望帮助到有同样困扰的 gopher。

怎么使用 mysql 丝滑利器

  • 安装库
1
2
go get github.com/hopehook/golang-db/mysql
go get github.com/go-sql-driver/mysql

Tips: go-sql-driver Version >= 1.4

  • 初始化
1
2
3
4
import "github.com/hopehook/golang-db/mysql"

// 全局变量
DB := mysql.InitMySQLPool(host, database, user, password, charset, maxOpenConns, maxIdleConns)
  • 查询
    • Get - 单个查询
      • 返回结果是一个 map[string]interface{} 字典类型
      • map 的 key 是字段名,value 是接口
      • 字段名与数据库表一一对应,无需另外单独定义一个 struct
    • Query - 批量查询
      • 返回结果是一个 []map[string]interface{} slice 类型
      • map 的 key 是字段名,value 是接口
      • 字段名与数据库表一一对应,无需另外单独定义一个 struct
      • 不用繁琐的遍历 rows
      • 不用关闭 rows 等

Tips: 使用字段时需要按照数据库定义断言一次

1
2
3
4
5
6
7
// 单个查询
data, err := DB.Get(`select id from table limit 1`)
println(data["id"].(int))

// 批量查询
rows, err := DB.Query(`select id from table limit 2`)
println(rows)
  • 更改
    • Insert - 快捷插入
      • 返回插入的记录 ID
    • Update - 快捷更新
      • 返回更新的记录数
    • Delete - 快捷删除
      • 返回删除的记录数
    • Exec - 通用方法
      • 返回通用的操作结果
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 插入
lastId, err := DB.Insert(`insert into table (id) values (1)`)
println(lastId)

// 更新
affect, err := DB.Update(`update table set id = 2 where id = 1`)
println(affect)

// 删除
affect, err = DB.Delete(`delete from table where id = 1`)
println(affect)
  • 事务
1
2
3
4
TX, _ := DB.Begin()
defer TX.Rollback()
TX.Exec(`delete from table where id = 1`)
TX.Commit()

Tips: 事务同样支持 Update/Insert/Delete 等快捷方法

  • 访问标准库的 DB

标准库对应的 DB 句柄是 DB.SQLDB,可以使用标准库的所有方法,主要是以 Query,Exec 开头扩展的系列方法。 使用标准库需要搞清楚很多细节, 比如 stmt,rows,row 等概念,对 null 的特殊处理,不熟悉的朋友容易出错。 项目中不建议直接使用标准库,比较难用,一般有第三方的 orm 库和 sqlx 类强化的库。

1
2
# 项目中不建议直接使用 不如一些第三方库 比如 sqlx 等好用
SqlDB := DB.SQLDB

怎么使用 redis 丝滑利器

  • 安装库
1
go get github.com/hopehook/golang-db/redis
  • 初始化
1
2
3
4
import "github.com/hopehook/golang-db/redis"

// 全局变量
CacheDB := redis.InitRedisPool(host, password, database, maxOpenConns, maxIdleConns)
  • string
    • SetString - 写入 string
      • 自动处理连接池回收
    • GetString
      • 自动转换返回的 string 类型数据
      • 自动处理连接池回收
1
2
3
4
CacheDB.SetString("test_key", "test_value")

value, err := CacheDB.GetString("test_key")
println(value)