下面我们对其中的几个常用方法做简单介绍,其他条件查询方法用法类似。
Where/WhereOr
查询条件
这两个方法用于传递查询条件参数,支持的参数为任意的string/map/slice/struct/*struct
类型。
Where
条件参数推荐使用字符串的参数传递方式(并使用?
占位符预处理),因为map
/struct
类型作为查询参数无法保证顺序性,且在部分情况下(数据库有时会帮助你自动进行查询索引优化),数据库的索引和你传递的查询条件顺序有一定关系。
当使用多个Where
方法连接查询条件时,多个条件之间使用And
进行连接。 此外,当存在多个查询条件时,gdb
会默认将多个条件分别使用()
符号进行包含,这种设计可以非常友好地支持查询条件分组。
// WHERE `uid`=1
Where("uid=1")
Where("uid", 1)
Where("uid=?", 1)
Where(g.Map{"uid" : 1})
// WHERE `uid` <= 1000 AND `age` >= 18
Where(g.Map{
"uid <=" : 1000,
"age >=" : 18,
})
// WHERE (`uid` <= 1000) AND (`age` >= 18)
Where("uid <=?", 1000).Where("age >=?", 18)
// WHERE `level`=1 OR `money`>=1000000
// WHERE (`level`=1) OR (`money`>=1000000)
Where("level", 1).WhereOr("money >=", 1000000)
// WHERE `uid` IN(1,2,3)
Where("uid IN(?)", g.Slice{1,2,3})
使用struct
参数的示例,其中orm
的tag
用于指定struct
属性与表字段的映射关系:
type Condition struct{
Sex int `orm:"sex"`
Age int `orm:"age"`
}
Where(Condition{1, 18})
// WHERE `sex`=1 AND `age`=18
使用示例
Where + string
,条件参数使用字符串和预处理。
Where + slice
,预处理参数可直接通过slice
参数给定。
// SELECT * FROM user WHERE age>18 AND name like '%john%'
g.Model("user").Where("age>? AND name like ?", g.Slice{18, "%john%"}).All()
g.Model("user").Where("status=?", g.Slice{1}).All()
Where + map
,条件参数使用任意map
类型传递。
// SELECT * FROM user WHERE uid=1 AND name='john' LIMIT 1
g.Model("user").Where(g.Map{"uid" : 1, "name" : "john"}).One()
// SELECT * FROM user WHERE uid=1 AND age>18 LIMIT 1
g.Model("user").Where(g.Map{"uid" : 1, "age>" : 18}).One()
以上的查询条件相对比较简单,我们来看一个比较复杂的查询示例。
condition := g.Map{
"title like ?" : "%九寨%",
"online" : 1,
"hits between ? and ?" : g.Slice{1, 10},
"exp > 0" : nil,
"category" : g.Slice{100, 200},
}
// SELECT * FROM article WHERE title like '%九寨%' AND online=1 AND hits between 1 and 10 AND exp > 0 AND category IN(100,200)
g.Model("article").Where(condition).All()
Wheref
格式化条件字符串
在某些场景中,在输入带有字符串的条件语句时,往往需要结合fmt.Sprintf
来格式化条件(当然,注意在字符串中使用占位符代替变量的输入而不是直接将变量格式化),因此我们提供了Where+fmt.Sprintf
结合的便捷方法Wheref
。使用示例:
// WHERE score > 100 and status in('succeeded','completed')
Wheref(`score > ? and status in (?)`, 100, g.Slice{"succeeded", "completed"})
WherePri
支持主键的查询条件
WherePri
方法的功能同Where
,但提供了对表主键的智能识别,常用于根据主键的便捷数据查询。假如user
表的主键为uid
,我们来看一下Where
与WherePri
的区别:
可以看到,当使用WherePri
方法且给定参数为单一的参数基本类型或者类型时,将会被识别为主键的查询条件值。