全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-21 8 分钟 ✍️ juanwangdev

GORM 链式查询详解

GORM 支持链式调用构建复杂查询,本文介绍其核心用法。

什么是链式查询

链式查询是通过连续调用多个查询方法,逐步添加条件,最终执行查询的编程模式。

链式调用规则

Go
db.Select("name, age").
    Where("age > ?", 18).
    Where("status = ?", "active").
    Order("age DESC").
    Limit(10).
    Find(&users)

链式调用中的每个方法返回 *gorm.DB,可继续调用其他方法,直到调用 Find/First/Take 等执行方法。

常用链式方法

Select - 选择字段

Go
// 选择特定字段
db.Select("name, age").Find(&users)

// 排除字段
db.Select("*").Omit("password, created_at").Find(&users)

Where - 查询条件

Go
// 等值查询
db.Where("name = ?", "张三").First(&user)

// 多条件 AND
db.Where("age > ?", 18).Where("status = ?", "active").Find(&users)

// IN 查询
db.Where("id IN ?", []int{1, 2, 3}).Find(&users)

// 结构体查询
db.Where(&User{Name: "张三", Status: "active"}).Find(&users)

Order - 排序

Go
// 单字段排序
db.Order("age DESC").Find(&users)

// 多字段排序
db.Order("age DESC, name ASC").Find(&users)

Group - 分组

Go
// 分组查询
db.Select("age, COUNT(*) as count").
    Group("age").
    Having("COUNT(*) > ?", 1).
    Find(&results)

链式组合示例

Go
db.Model(&User{}).
    Select("id, name, age, status").
    Where("age BETWEEN ? AND ?", 20, 40).
    Where("status IN ?", []string{"active", "pending"}).
    Where("name LIKE ?", "%张%").
    Order("age DESC").
    Group("status").
    Having("COUNT(*) > ?", 0).
    Limit(20).
    Find(&users)

注意事项

  • 链式方法不调用执行方法(Find/First等)不会产生 SQL 查询
  • 多个 Where 默认是 AND 关系,OR 需用 Or() 方法
  • Model() 方法指定查询目标,链式调用中可省略
  • 链式调用中的条件顺序影响 SQL 生成顺序

要点总结

  • 链式调用通过连续方法构建查询,最终调用执行方法
  • Select/Where/Order/Group/Limit 等方法返回 *gorm.DB
  • 多个 Where 是 AND 关系,Or 方法实现 OR
  • 链式不调用执行方法不会产生数据库查询

文章存放路径:D:\git2\jwdev\articles\GORM\进阶\高级查询技术\链式查询详解.md

📝 发现内容有误?点击此处直接编辑

← 上一篇 GORM 子查询实现
下一篇 → GORM 事务上下文传递
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库