Beego ORM用Not("field", value)实现不等于查询,等价于NOT (field = ?),但NULL值不会被包含,需显式加Or("field__isnull", true)补充;Exclude语义更清晰且支持嵌套字段。

Beego ORM 怎么用 Not 查询不等于某个值的记录
Beego 的 orm.QuerySeter 没有直接叫 != 或 ne 的方法,但提供了 Not 方法来实现“不等于”语义。它不是简单地对字段做 !=,而是支持多种否定条件组合,必须配合字段名和值一起使用。
-
Not接收两个参数:字段名(字符串)和期望排除的值,例如Not("status", 1) - 它底层生成的是 SQL 的
NOT (status = ?),等价于status != ?(在大多数数据库中行为一致) - 注意:不能写成
Not("status = 1")或Not("status != 1")—— 这会报错或无效 - 如果要否定多个条件(如 status ≠ 1 且 name ≠ "admin"),需链式调用多次
Not,或改用Filter+Exclude组合
Beego ORM Not 和 Exclude 有什么区别
Not 是底层查询构造器方法,作用于单个字段的相等性否定;Exclude 是更高层的封装,语义更明确,且支持嵌套字段(如 user__name)和更自然的多条件排除。
-
Not("age", 25)→ 生成NOT (age = 25) -
Exclude("age", 25)→ 效果相同,但更易读,也兼容更多类型(如Exclude("status__in", []int{1,2})) - 对字符串字段,
Exclude("name", "")可安全排除空值;而Not("name", "")在某些数据库里可能因 NULL 处理逻辑导致漏匹配(NULL != '' 返回 UNKNOWN) - 性能上无差异,两者最终都编译为相同 SQL
查询时遇到 NULL 值,Not 为什么查不到预期结果
这是最容易踩的坑:SQL 中 NULL != 1 不返回 TRUE,而是 UNKNOWN,所以被 WHERE 过滤掉。Beego 的 Not 同样受此影响 —— 它不会自动包含 NULL 记录。
- 若想查 “status 不等于 1,且包括 status 为 NULL 的记录”,得显式补上
Or条件:qs.Not("status", 1).Or("status__isnull", true) - 或者改用
Filter("status__isnull", true).Or("status__ne", 1)(注意__ne是 Beego 1.12+ 支持的快捷 Filter,底层仍转为Not) - 检查数据库实际数据是否有 NULL:用原生 SQL
SELECT * FROM table WHERE status IS NULL确认
完整可运行示例:查 status ≠ 0 的用户
假设模型为 User,含字段 Id、Name、Status(int):
o := orm.NewOrm()
var users []*User
qs := o.QueryTable(&User{})
_, err := qs.Not("Status", 0).All(&users)
if err != nil {
// 处理错误
}
// users 中将包含 Status=1,2,... 的记录,但不含 Status=0 的;Status=NULL 的也不会出现
如果业务上 NULL 表示“未激活”,也想包含,就得加 Or 条件 —— 这个细节常被忽略,上线后才发现缺数据。











