加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

beego之orm的查询方法-SetCond全解析(转)

(2014-08-12 21:16:13)
标签:

佛学

分类: 编程
转自: http://golanghome.com/post/251

Filter方法和Exclude方法内部都是使用SetCond方法来连接查询字符串的。当然这里我们也可以直接使用SetCond来自己连接查询字符串,然后使用同样的方法去查询数据。Filter方法和Exclude方法原型如下。

Filter(string, ...interface{}) QuerySeter
Exclude(string, ...interface{}) QuerySeter
而在beego框架中,这两个方法的实现如下:

// add condition expression to QuerySeter.
func (o querySet) Filter(expr string, args ...interface{}) QuerySeter {
    if o.cond == nil {
        o.cond = NewCondition()
    }
    o.cond = o.cond.And(expr, args...)
    return &o
}

// add NOT condition to querySeter.
func (o querySet) Exclude(expr string, args ...interface{}) QuerySeter {
    if o.cond == nil {
        o.cond = NewCondition()
    }
    o.cond = o.cond.AndNot(expr, args...)
    return &o
}
我们可以看出,Filter方法实际是将一个或多个条件按照AND的关系来连接起来,而Exclude则是将一个或多个条件按照AND NOT的关系来连接起来。

我们这里直接使用orm.Condition的对象来连接字符串。

package main

import (
    "fmt"
    "github.com/astaxie/beego/orm"
    _ "github.com/go-sql-driver/mysql"
)

const (
    DRIVER_NAME   = "mysql"
    DATA_SOURCE   = "root:root@tcp(localhost:3306)/test?charset=utf8&loc=Asia/Shanghai"
    MAX_IDLE_CONN = 5
    MAX_OPEN_CONN = 30
)

type User struct {
    Id       int
    Name     string `orm:"size(20)"`
    Email    string `orm:"size(50)"`
    Age      int
    IsActive bool
}

func (this User) ToString() string {
    return fmt.Sprintf("Name:%s\tEmail:%s\tAge:%d\tIsActive:%v", this.Name, this.Email, this.Age, this.IsActive)
}

func registerDB() {
    orm.Debug = true
    orm.RegisterDataBase("default", DRIVER_NAME, DATA_SOURCE, MAX_IDLE_CONN, MAX_OPEN_CONN)
    orm.RegisterModel(new(User))
}

func queryUsers() {
    var users []User
    var cond *orm.Condition
    cond = orm.NewCondition()
    cond = cond.And("Name__contains", "j")
    cond = cond.And("Age__lte", 25)
    var qs orm.QuerySeter
    qs = orm.NewOrm().QueryTable("user").SetCond(cond)
    cnt, err := qs.All(&users)
    printUsers(cnt, err, users)
}

func printUsers(cnt int64, err error, users []User) {
    fmt.Printf("Queried %d users\r\n", cnt)
    if err == nil {
        for _, user := range users {
            fmt.Println(user.ToString())
        }
    }
}

func main() {
    registerDB()
    queryUsers()
}
得到的结果如下:

[ORM] - 2014-08-12 19:18:14 - [Queries/default] - [  OK /    db.Query /     0.3ms] - [SELECT T0.`id`, T0.`name`, T0.`email`, T0.`age`, T0.`is_active` FROM `user` T0 WHERE T0.`name` LIKE BINARY ? AND T0.`age` <= ? LIMIT 1000] - `%j%`, `25`
Queried 2 users
Name:jemy   Email:jemy@golanghome.com   Age:25  IsActive:false
Name:john   Email:john@golanghome.com   Age:24  IsActive:false
之所以要保留SetCond方法来设置查询条件是因为实际的查询过程可能很复杂,以至于无论Filter还是Exculde都不能满足条件,这种情况下,我们可以使用SetCond方法。

另外orm.Condition支持的方法列表如下:

func (c Condition) And(expr string, args ...interface{}) *Condition
func (c *Condition) AndCond(cond *Condition) *Condition
func (c Condition) AndNot(expr string, args ...interface{}) *Condition
func (c *Condition) IsEmpty() bool
func (c Condition) Or(expr string, args ...interface{}) *Condition
func (c *Condition) OrCond(cond *Condition) *Condition
func (c Condition) OrNot(expr string, args ...interface{}) *Condition
从上面的方法列表中,我们可以看出,需要将每次调用方法的结果都赋值给原来的那个orm.Condition对象来更新查询条件,就像上面的例子中那样。

var cond *orm.Condition
cond = orm.NewCondition()
cond = cond.And("Name__contains", "j")
cond = cond.And("Age__lte", 25)

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有