跳到主要内容

sqlx

问题

sqlx 和 database/sql 有什么区别?什么时候用 sqlx?

答案

sqlx 简介

sqlxdatabase/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/sqlsqlxGORM
学习成本
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"`
}

相关链接