全部学科
Python全栈
python
NodeJS全栈
nodejs
📅 2026-05-21 6 分钟 ✍️ juanwangdev

GORM 查询条件构建

GORM 提供 WhereNotOr 等方法,支持灵活组合查询条件。

定义

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 多种条件格式
  • 多个 WhereAND 连接,Or 优先级较低
  • 复杂条件使用括号明确分组逻辑
  • 始终使用 ? 占位符防止 SQL 注入
想在手机上练习这篇文章的配套题目?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一篇 GORM 删除记录
下一篇 → gorm tag 使用
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码