全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 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 查询记录基础
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

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

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