在Beego中需用QueryTable构建查询集,通过Filter添加AND条件(支持双下划线表达式),All获取全部结果并可指定字段,Exclude实现NOT筛选,Limit和Offset用于分页。

要在Beego框架中用ORM查询满足特定条件的数据列表,比如查出所有状态为“启用”且城市是“深圳”的用户,不能只靠Read或Insert这类单条操作,必须借助QueryTable构建可链式调用的查询集。
用QueryTable启动查询
先获取QuerySeter对象,这是后续加Filter、All等操作的前提。表名必须与数据库真实表名一致,大小写敏感。
o := orm.NewOrm()
qs := o.QueryTable("user")
如果模型已定义TableName()方法,也可以传入结构体实例:
user := new(models.User)
qs := o.QueryTable(user)
添加一个或多个查询条件
Filter方法用于设置WHERE子句中的等值或范围条件,多个Filter自动拼成AND关系。
方法一:精确匹配字段值
qs.Filter("status", 1)
方法二:使用双下划线表达式做范围/模糊查询
qs.Filter("created__gte", "2025-01-01") → 查询创建时间大于等于该日期的记录
qs.Filter("username__icontains", "admin") → 不区分大小写包含"admin"
【注意:字段名必须是模型中定义的字段名,不是数据库列名;若字段是外键关联字段(如Profile),需用Profile__age形式】
执行查询并获取全部结果
第一步:定义接收数据的切片变量,类型必须与模型一致
var users []models.User
第二步:调用All方法触发查询,返回匹配的所有行(默认最多1000条)
num, err := qs.All(&users)
第三步:检查err是否为nil,再处理num(实际返回行数)和users数据
if err != nil { panic(err) }
fmt.Printf("共查到 %d 条用户", num)
All方法还支持指定返回字段,减少网络传输和内存占用:
num, err := qs.All(&users, "id", "username", "city")
排除某些数据(反向筛选)
Exclude与Filter逻辑相反,用于NOT条件。它不能单独使用,必须挂载在已有QuerySeter上。
qs.Filter("status", 1).Exclude("city", "beijing") → 查启用状态但城市不是北京的用户
Exclude也支持双下划线表达式:
qs.Exclude("last_login__isnull", true) → 排除最后登录时间为空的记录
限制返回数量和分页
Limit控制最多返回多少条,Offset跳过前N条——这是实现分页的核心。
从第10条开始取20条:
qs.Limit(20).Offset(10).All(&users)
注意:Limit必须在All之前调用,否则无效。如果只调用Limit(10),就等价于SQL里的LIMIT 10。
实际分页中常组合使用:
qs.Filter("status", 1).Limit(pageSize).Offset((page-1)*pageSize).All(&users)


















