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 等价 | 说明 |
|---|---|---|
| Where | AND | 添加且条件 |
| Not | NOT / != | 添加排除条件 |
| Or | OR | 添加或条件 |
注意事项
- 多个
Where默认用AND连接Or的优先级低于Where,需用括号明确分组- 结构体条件只使用非零值字段,零值字段会被忽略
- 防止 SQL 注入:使用
?占位符,避免拼接用户输入- 复杂条件建议先用字符串显式编写,提高可读性
要点总结
Where添加且条件,Not排除条件,Or添加或条件- 支持字符串、结构体、Map 多种条件格式
- 多个
Where用AND连接,Or优先级较低 - 复杂条件使用括号明确分组逻辑
- 始终使用
?占位符防止 SQL 注入
📝 发现内容有误?点击此处直接编辑