beego之orm的查询方法-SetCond全解析(转)
(2014-08-12 21:16:13)
标签:
佛学 |
分类: 编程 |
转自: http://golanghome.com/post/251
if o.cond == nil {
o.cond = NewCondition()
}
o.cond =
o.cond.And(expr, args...)
return &o
if o.cond == nil {
o.cond = NewCondition()
}
o.cond =
o.cond.AndNot(expr, args...)
return &o
"fmt"
"github.com/astaxie/beego/orm"
_
"github.com/go-sql-driver/mysql"
DRIVER_NAME
= "mysql"
DATA_SOURCE
=
"root:root@tcp(localhost:3306)/test?charset=utf8&loc=Asia/Shanghai"
MAX_IDLE_CONN = 5
MAX_OPEN_CONN = 30
Id
int
Name
string `orm:"size(20)"`
Email
string `orm:"size(50)"`
Age
int
IsActive bool
return
fmt.Sprintf("Name:%s\tEmail:%s\tAge:%d\tIsActive:%v", this.Name,
this.Email, this.Age, this.IsActive)
orm.Debug = true
orm.RegisterDataBase("default", DRIVER_NAME, DATA_SOURCE,
MAX_IDLE_CONN, MAX_OPEN_CONN)
orm.RegisterModel(new(User))
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)
fmt.Printf("Queried %d
users\r\n", cnt)
if err == nil {
for _, user := range users {
fmt.Println(user.ToString())
}
}
registerDB()
queryUsers()
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 {
}
// add NOT condition to querySeter.
func (o querySet) Exclude(expr string, args ...interface{})
QuerySeter {
}
我们可以看出,Filter方法实际是将一个或多个条件按照AND的关系来连接起来,而Exclude则是将一个或多个条件按照AND
NOT的关系来连接起来。
我们这里直接使用orm.Condition的对象来连接字符串。
package main
import (
)
const (
)
type User struct {
}
func (this User) ToString() string {
}
func registerDB() {
}
func queryUsers() {
}
func printUsers(cnt int64, err error, users []User) {
}
func main() {
}
得到的结果如下:
[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)