gdbutil
gdbutil是一个给Golang开发者提供的数据库工具包。它可以帮助开发者快速构建数据库应用,免除很多冗余代码的编写,使用ORM风格的代码让数据库操作更加可读等。
golang api
使用gdbutil的api,建议直接使用go get命令将其导入到项目中:
$ go get github.com/fioncat/gdbutil/api
目前提供的api如下表所示:
api |
描述 |
文档 |
sqlutil |
基于"database/sql"的扩展 - orm功能 - sql拼接器 - 基于sql.NullType 扩展的sqlutil.SetType ,用于动态SQL场景 - 各种执行器和工具函数,减少重复代码 |
待定 |
cache |
在数据库的基础上做两层缓存 - L1缓存为远程缓存,一般为redis - L2缓存为本地lru缓存,一般只有热key数据才会存到L2缓存 - 当L1和L2都没有获取到才去数据库获取,并把数据加到缓存 - 提供修改和删除的功能,会同时触发缓存和数据库 - 提供分布式锁(可基于redis,etcd,zookeeper,也可以自定义实现) 防止分布式场景下的数据不一致问题 |
待定 |
使用的时候,直接导入代码即可,例如要使用sqlutil
下的sql构造器来创建一个简单的sql插入语句:
package main
import (
"fmt"
"github.com/fioncat/gdbutil/api/sqlutil"
)
func main() {
builder := sqlutil.NewBuilder("user")
builder.SetFields([]string{"name", "age", "password", "email"})
builder.SetPrepare(false)
builder.AddBatch([]interface{}{"John", 12, "abc", "john@gmail.com"})
builder.AddBatch([]interface{}{"Jim", 25, "efg", "jim@gmail.com"})
sqlRes := builder.Insert()
sql := sqlRes.Sql
fmt.Println(sql)
}
程序输出:
INSERT INTO `user`(`name`,`age`,`password`,`email`) VALUES ('John','12','abc','john@gmail.com'),('Jim','25','efg','jim@gmail.com')
toolkit主要是一系列的命令行工具。请到 release page 下载。下载解压后,将bin
下的二进制程序放到PATH
下即可使用。或者,如果你的本机有Golang开发环境,也可以clone整个项目并自己进行build。关于build的说明请见下一章。
下面是gdbutil提供的关键命令行的基本特性
1. gdb gen
: 用于自动生成Golang代码
- 支持多种文件的生成,这里主要介绍sql代码的生成,其它见文档。
- 可以直接根据数据库的表来生成表的orm结构体,并为结构体生成各种CURD代码,和基础的查询代码。对于非复杂查询情况,几乎所有的数据库操作都可以用orm实现。
- 对于复杂的sql查询或执行语句,可以在sql文件中直接书写,在其中插入占位符
${name}
来表示查询的参数。每个sql语句会生成一个函数。直接根据数据库字段自动生成该sql语句的返回结构体,函数可以直接返回这个结构体。
- 支持更多高级的功能:sql复用,定义通用的sql语句,在其它sql语句中通过占位符导入;在sql语句中加入
if
和for
注释来根据参数动态拼凑sql语句;多表查询时,支持自动生成复杂结构体,例如一个结构体包含多个表的字段,或者一个结构体组合多个表的结构体,不论什么情况,gengdb都能生成这种结构体的rows.Scan
的扫描代码等。
- 一般的情况下,对于简单的,非复杂查询的sql语句,都可以直接使用orm风格的编码,gdbutil会使用反射自动生成sql语句(这里的反射场景很简单,不用担心效率问题);对于很复杂的sql,例如涉及到子查询,关联查询,动态条件查询等,可以直接编写sql语句,并生成对应的调用函数。这样的运作方式有点类似于Java的
MyBatis
+MyBatisPlus
,但是更加轻量。
- 了解更多,见sql文档,或例子。
2. gdb mock
: 用于在数据库制造调试数据
-
在很多场景下,在开发和测试的时候,可能需要制造大量的伪数据来模拟真实环境;或是在多系统的场景下,在数据入口尚未开发测试的时候,需要模拟数据来测试数据使用的场景。这时用到mockgdb可以非常方便地在数据库伪造数据。
-
mockgdb主要使用配置文件来定义伪造的表、字段、字段值。这种文件支持多种配置和规则。例如,要生成一个随机的邮箱地址,可以使用规则randstr(low+up+num,10)'@'dict(gmail,163,126,qq)'.com'
。这个规则包含4个部分:
- randstr(low+up+num,10): 生成10个长度的随机小写字母、大写字母、数字。例如"a1dCs14dsH"。
- '@': 字符串常量
- dict(gmail,163,126,qq): 每次从
"gmail"
, "163"
,"126"
,"qq"
这些字符串中挑选一个
- '.com': 字符串常量
这样就可以生成诸如"a1dCs14dsH@gmail.com"这样的邮箱格式的字符串了。mockgdb支持很多规则,详见文档。
-
mockgdb还支持很多高级用法:外部导入参数,定义变量,随机生成数据个数等。
-
了解更多,见mockgdb文档,或例子。
Build
首先,将项目clone到本地:
$ git clone https://github.com/fioncat/gdbutil.git
$ cd gdbutil
本项目由Golang开发,请确保本机有go开发环境,作者的go环境是:
$ go version
go version go1.13.6 darwin/amd64
一般使用go 1.11
以上的版本即可构建。构建的时候请开启go mod
:
$ go env -w GO111MODULE=on
在linux或unix环境下,推荐直接使用Makefile进行构建:
$ GDBUTIL_OUT=/path/to/build make
你可以在/path/to/build
下找到构建好的程序,如果不提供GDBUTIL_OUT
,那么默认会输出到项目的out
路径下。
如果你的系统不支持Makefile,可以直接用go命令进行构建:
$ go build -v -o gdb cmdt/*
这会直接在当前目录下生成构建好的程序gdb
,它包含了gdbutil的所有命令行工具。