首页/ 学科题库/ gorm/ GORM 查询条件构建
gorm 实战教程

GORM 查询条件构建

2026-05-21 约 6 分钟 juanwangdev

GORM 查询条件构建

GORM 提供 Where、Not、Or 等方法,支持灵活组合查询条件。

定义

Where 添加正向条件,Not 添加排除条件,Or 添加或条件,支持链式调用构建复杂查询。

语法

Go
func (db *DB) Where(query interface{}, args ...interface{}) (tx *DB)
func (db *DB) Not(query interface{}, args ...interface{}) (tx *DB)
func (db *DB) Or(query interface{}, args ...interface{}) (tx *DB)

示例

Where 基础用法

Go
// 字符串条件
db.Where("name = ?", "张三").Find(&users)

// 多个条件
db.Where("name = ? AND age >= ?", "张三", 18).Find(&users)

// IN 查询
db.Where("name IN ?", []string{"张三", "李四"}).Find(&users)

// BETWEEN 查询
db.Where("age BETWEEN ? AND ?", 18, 30).Find(&users)

结构体与 Map 条件

Go
// 结构体(非零值字段作为条件)
db.Where(&User{Name: "张三", Age: 25}).Find(&users)

// Map
db.Where(map[string]interface{}{"name": "张三", "age": 25}).Find(&users)

Not 排除条件

Go
// 不等于
db.Not("name = ?", "张三").Find(&users)

// NOT IN
db.Not("name IN ?", []string{"张三", "李四"}).Find(&users)

// 主键不等于
db.Not(10).Find(&users) // WHERE id != 10

Or 或条件

Go
db.Where("role = ?", "admin").Or("role = ?", "super_admin").Find(&users)

// 链式组合
db.Where("age > ?", 18).Where("status = ?", "active").Or("vip = ?", true).Find(&users)

复杂条件组合

Go
// (role = 'admin' OR role = 'moderator') AND status = 'active'
db.Where("(role = ? OR role = ?) AND status = ?", "admin", "moderator", "active").Find(&users)

// 分组条件
db.Where("age > ?", 18).Where(db.Where("status = ?", "active").Or("vip = ?", true)).Find(&users)

内联条件

Go
// 直接在方法中传入条件
db.First(&user, "id = ?", 10)
db.Find(&users, "age > ?", 18)

逻辑运算符对比

方法SQL 等价说明
WhereAND添加且条件
NotNOT / !=添加排除条件
OrOR添加或条件

注意事项

  • 多个 Where 默认用 AND 连接
  • Or 的优先级低于 Where,需用括号明确分组
  • 结构体条件只使用非零值字段,零值字段会被忽略
  • 防止 SQL 注入:使用 ? 占位符,避免拼接用户输入
  • 复杂条件建议先用字符串显式编写,提高可读性

要点总结

  • Where 添加且条件,Not 排除条件,Or 添加或条件
  • 支持字符串、结构体、Map 多种条件格式
  • 多个 Where 用 AND 连接,Or 优先级较低
  • 复杂条件使用括号明确分组逻辑
  • 始终使用 ? 占位符防止 SQL 注入
想在手机上练这篇的配套题目?
使用微信 卷王开发者小程序/App,首页顶部扫一扫识别下方二维码,即可解锁本讲对应真题与错题本。
了解产品 App
← 上一篇 GORM 删除记录 下一篇 → gorm tag 使用