网站首页 » Beego » Beego 常用的查询

Beego 常用的查询

June 27, 2020 Beego

经常使用的查询 链式操作

基本使用方法:


o := orm.NewOrm()

// 获取 QuerySeter 对象,user 为表名
qs := o.QueryTable("user")

// 也可以直接使用对象作为表名
user := new(User)
qs = o.QueryTable(user) // 返回 QuerySeter

Filter 相当于where()

用来过滤查询结果,起到 包含条件 的作用

多个 Filter 之间使用 AND 连接

qs.Filter("profile__isnull", true).Filter("name", "slene")
// WHERE profile_id IS NULL AND name = 'slene'

RelatedSel

关系查询, 用于在models.go 文件中定义好了对应关系

var DefaultRelsDepth = 5 // 默认情况下直接调用 RelatedSel 将进行最大 5 层的关系查询

qs := o.QueryTable("post")

qs.RelatedSel()
// INNER JOIN user ... LEFT OUTER JOIN profile ...

qs.RelatedSel("user")
// INNER JOIN user ...
// 设置 expr 只对设置的字段进行关系查询

// 对设置 null 属性的 Field 将使用 LEFT OUTER JOIN

All

返回对应的结果集对象
All 的参数支持 []Type 和 []*Type 两种形式的 slice

var users []*User
num, err := o.QueryTable("user").Filter("name", "slene").All(&users)
fmt.Printf("Returned Rows Num: %s, %s", num, err)

Values

返回结果集的 key => value 值

key 为Model里的Field name, value的值是interface{}类型,例如,如果你要将value赋值给struct中的某字段,需要根据结构体对应字段类型使用断言获取真实值。举例:Name : m["Name"].(string)

var maps []orm.Params
num, err := o.QueryTable("user").Values(&maps)
if err == nil {
    fmt.Printf("Result Nums: %d\n", num)
    for _, m := range maps {
        fmt.Println(m["Id"], m["Name"])
    }
}

All 与 Values 的区别

All 返回的是切片, Values返回的是map
All 支持RelatedSel()查询, Values不支持

One

尝试返回单条记录

var user User
err := o.QueryTable("user").Filter("name", "slene").One(&user)
if err == orm.ErrMultiRows {
    // 多条的时候报错
    fmt.Printf("Returned Multi Rows Not One")
}
if err == orm.ErrNoRows {
    // 没有找到记录
    fmt.Printf("Not row found")
}
添加新评论