Go mod 好菜系列 - 0x09 sqlx 夹在原生 SQL 和 ORM 之间的那口菜
详细讲 sqlx 为什么受欢迎、比 database/sql 多了什么、比 ORM 少了什么,以及它为什么适合想手写 SQL 但又不想太原始的人。
如果你对 gorm 这种 ORM 的感觉是“方便是方便,但总怕它在背后搞了我不想要的 SQL”,那你大概率会喜欢 sqlx 这种路线。它不像 ORM 那么强调模型驱动,也不像原生 database/sql 那么朴素到什么都得自己搓。
sqlx 到底是什么
可以把它理解成 database/sql 的增强版工具层。它没有想替你发明一套 ORM 世界观,而是尽量保留原生 SQL 的掌控感,同时补一些“明明很基础却老得手写”的能力。
它最让人舒服的地方:结构体映射
type User struct {
ID int64 `db:"id"`
Name string `db:"name"`
Email string `db:"email"`
}var user User
err := db.Get(&user, "SELECT id, name, email FROM users WHERE id = ?", 1)对比原生 Scan 一列一列手摆,这种写法轻松很多,尤其字段一多的时候价值特别明显。
查多条也很顺
var users []User
err := db.Select(&users, "SELECT id, name, email FROM users ORDER BY id DESC LIMIT 20")这类“我 SQL 自己写,但结果映射你帮我收一收”的手感,就是 sqlx 最迷人的地方。
命名参数也很有用
query := "SELECT * FROM users WHERE name = :name AND status = :status"
args := map[string]interface{}{
"name": "Raymond",
"status": "active",
}
rows, err := db.NamedQuery(query, args)对复杂条件尤其是拼装查询时,命名参数往往比一串问号更不容易把自己看晕。
它和 gorm 最大的区别是什么
一句话:
- gorm 更偏 ORM,强调模型和链式 API
- sqlx 更偏 SQL 优先,强调“我自己写 SQL,但你帮我少点体力劳动”
这也是为什么很多有一定 SQL 控制欲的团队,会更偏爱 sqlx。
什么时候它特别适合你
- 你愿意手写 SQL
- 你想更清楚地知道数据库到底在执行什么
- 你又不想每次都手动一个字段一个字段 Scan
它很适合那种“我要掌控感,但也不想回到石器时代”的项目风格。
它不替你做什么
sqlx 虽然顺手,但别误会它会替你自动做这些:
- 模型迁移
- 关联关系管理
- 复杂 ORM 封装
- 查询构造器魔法
也就是说,它没有想替你决定数据库开发风格,它只是帮你把低级重复劳动减掉。
小结
sqlx 是一口很适合工程派的菜:
- 保留原生 SQL 的掌控感
- 用结构体映射和命名参数减少体力劳动
- 比 ORM 更透明,比原生 sql 更顺手
- 特别适合不想把数据库逻辑完全交给 ORM 的团队
下一篇我们讲 ent。这道菜比 sqlx 和 gorm 都更偏“体系化”,喜欢它的人会很喜欢,不喜欢的人也会嫌它重。