前言
今天看到了一个 Go ORM 工具 sqlboiler,项目地址在: https://github.com/volatiletech/sqlboiler 。
// Ultra complex query
users, err := models.Users(
Select("id", "name"),
InnerJoin("credit_cards c on c.user_id = users.id"),
Where("age > ?", 30),
AndIn("c.kind in ?", "visa", "mastercard"),
Or("email like ?", `%aol.com%`),
GroupBy("id", "name"),
Having("count(c.id) > ?", 2),
Limit(5),
Offset(6),
).All(ctx, db)
初看 README 里实例感觉还不错,比起手动拼接字符串要高级上那么一点点。
image.png
下面的 benchmark 可以说是秒杀一众的 ORM 工具,是让人忍不住想试一下。
安装
文档中给出来的安装方法是:
go install github.com/volatiletech/sqlboiler/v4@latest
go install github.com/volatiletech/sqlboiler/v4/drivers/sqlboiler-psql@latest
它的drivers还有 sqlboiler-mysql 、 sqlboiler-sqlite3、 sqlboiler-mssql 。安装哪个取决于你要用什么数据库,当然也可以全部安装上。
使用
与 gorm 等其它 orm 工具不同,sqlboiler 可以说是一个代码生成工具,它根据数据库中已经存在的表,生成对应的 ORM 代码。
因此,要使用 sqlboiler 生成 ORM 相关的代码,必须先建好数据库,然后在项目的根目录写上一个配置文件 sqlboiler.toml
,把数据库的连接方式、数据表到结构体名字转换、字段类型转换等信息告诉它。文件的示例:
[mysql]
dbname = "testdb"
host = "localhost"
port = 3306
user = "root"
pass = ""
sslmode = "false"
output = "models"
pkgname = "models"
[[aliases.tables]]
name = "team_names"
up_plural = "TeamNames"
up_singular = "TeamName"
down_plural = "teamNames"
down_singular = "teamName"
[[aliases.tables.columns]]
name = "team_name"
alias = "OurTeamName"
[[aliases.tables.relationships]]
name = "fk_video_id"
local = "Rags"
foreign = "Videos"
然后再运行 sqlboiler 命令就可以生成出模型的代码。类似如下文件:
image.png
初次使用感受
和大包大揽的 gorm 不同,sqlboiler 不负责数据表的创建、升级,因此需要额外代码维护,或者有专门的dba来做相关工作。
另外文档中明确说了,缺少多列外键、视图的支持,对很多场景可能不实用。