MySQL

名称类型适用场景
GORMORM以模型和 CRUD 为主的项目
database/sql标准库通用关系型数据库访问与连接池管理
sqlxSQL 工具库手写 SQL,并简化结构体映射

下面的示例都使用同一个模型,并省略连接初始化和错误处理:

type User struct {
    ID   int64  `db:"id" gorm:"primaryKey"`
    Name string `db:"name"`
}

GORM

通过模型操作数据库,不需要手写基础 CRUD SQL。

user := User{Name: "Alice"}

db.Create(&user)                       // 增
db.First(&user, 1)                     // 查
db.Model(&user).Update("name", "Bob") // 改
db.Delete(&user)                       // 删

database/sql

直接执行 SQL,结果需要手动 Scan 到字段中。

db.ExecContext(ctx, "INSERT INTO users (name) VALUES (?)", "Alice")

var user User
db.QueryRowContext(ctx, "SELECT id, name FROM users WHERE id = ?", 1).
    Scan(&user.ID, &user.Name)

db.ExecContext(ctx, "UPDATE users SET name = ? WHERE id = ?", "Bob", 1)
db.ExecContext(ctx, "DELETE FROM users WHERE id = ?", 1)

sqlx

仍然手写 SQL,但可以直接映射结构体,并使用命名参数。

db.NamedExecContext(ctx, "INSERT INTO users (name) VALUES (:name)",
    map[string]any{"name": "Alice"})

var user User
db.GetContext(ctx, &user, "SELECT id, name FROM users WHERE id = ?", 1)

db.NamedExecContext(ctx, "UPDATE users SET name = :name WHERE id = :id",
    map[string]any{"id": 1, "name": "Bob"})
db.ExecContext(ctx, "DELETE FROM users WHERE id = ?", 1)