sqlx
问题
sqlx 和 database/sql 有什么区别?什么时候用 sqlx?
答案
sqlx 简介
sqlx 是 database/sql 的轻量增强,主要添加了:
- 结构体自动映射(
StructScan) - 命名参数(
NamedExec) In查询展开Get/Select简化方法
import "github.com/jmoiron/sqlx"
db, err := sqlx.Connect("mysql", dsn)
核心功能
// Select:查询多行直接映射到 slice
var users []User
err := db.SelectContext(ctx, &users,
"SELECT id, name, email FROM users WHERE age > ?", 18,
)
// Get:查询单行
var user User
err := db.GetContext(ctx, &user,
"SELECT * FROM users WHERE id = ?", 1,
)
// NamedExec:命名参数
_, err := db.NamedExecContext(ctx,
"INSERT INTO users (name, email) VALUES (:name, :email)",
User{Name: "Alice", Email: "alice@example.com"},
)
// In:展开 IN 查询
query, args, _ := sqlx.In(
"SELECT * FROM users WHERE id IN (?)", []int{1, 2, 3},
)
query = db.Rebind(query) // 重新绑定占位符
db.SelectContext(ctx, &users, query, args...)
sqlx vs GORM vs database/sql
| 维度 | database/sql | sqlx | GORM |
|---|---|---|---|
| 学习成本 | 低 | 低 | 中 |
| SQL 掌控 | 完全 | 完全 | 部分 |
| 结构体映射 | 手动 Scan | 自动 | 自动 |
| 性能 | 最快 | 接近原生 | 较慢 |
| 迁移/关联 | 无 | 无 | 内置 |
选型建议
- 喜欢写 SQL、性能敏感 → sqlx
- 快速开发、复杂关联 → GORM
- 类型安全 → sqlc(SQL 编译为 Go 代码)
常见面试问题
Q1: sqlx 的结构体映射原理?
答案:sqlx 使用反射读取结构体的 db tag,将 SQL 查询结果的列名映射到结构体字段。首次映射结果会被缓存,后续重用。
type User struct {
ID int `db:"id"`
Name string `db:"name"`
Email string `db:"email"`
}