- Created by 郭强, last modified by 海亮 on Aug 02, 2021
ORM
组件提供了一些常用的条件查询方法,并且条件方法支持多种数据类型输入。
func (m *Model) Where(where interface{}, args...interface{}) *Model func (m *Model) WherePri(where interface{}, args ...interface{}) *Model func (m *Model) WhereBetween(column string, min, max interface{}) *Model func (m *Model) WhereLike(column string, like interface{}) *Model func (m *Model) WhereIn(column string, in interface{}) *Model func (m *Model) WhereNull(columns ...string) *Model func (m *Model) WhereLT(column string, value interface{}) *Model func (m *Model) WhereLTE(column string, value interface{}) *Model func (m *Model) WhereGT(column string, value interface{}) *Model func (m *Model) WhereGTE(column string, value interface{}) *Model func (m *Model) WhereNotBetween(column string, min, max interface{}) *Model func (m *Model) WhereNotLike(column string, like interface{}) *Model func (m *Model) WhereNotIn(column string, in interface{}) *Model func (m *Model) WhereNotNull(columns ...string) *Model func (m *Model) WhereOr(where interface{}, args ...interface{}) *Model func (m *Model) WhereOrBetween(column string, min, max interface{}) *Model func (m *Model) WhereOrLike(column string, like interface{}) *Model func (m *Model) WhereOrIn(column string, in interface{}) *Model func (m *Model) WhereOrNull(columns ...string) *Model func (m *Model) WhereOrLT(column string, value interface{}) *Model func (m *Model) WhereOrLTE(column string, value interface{}) *Model func (m *Model) WhereOrGT(column string, value interface{}) *Model func (m *Model) WhereOrGTE(column string, value interface{}) *Model func (m *Model) WhereOrNotBetween(column string, min, max interface{}) *Model func (m *Model) WhereOrNotLike(column string, like interface{}) *Model func (m *Model) WhereOrNotIn(column string, in interface{}) *Model func (m *Model) WhereOrNotNull(columns ...string) *Model
下面我们对其中的几个常用方法做简单介绍,其他条件查询方法用法类似。
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=? OR money >=?", 1, 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
,条件参数使用字符串和预处理。
// 获取默认配置的数据库对象(配置名称为"default") db := g.DB() // 查询多条记录并使用Limit分页 // SELECT * FROM user WHERE uid>1 LIMIT 0,10 db.Model("user").Where("uid > ?", 1).Limit(0, 10).All() // 使用Fields方法查询指定字段 // 未使用Fields方法指定查询字段时,默认查询为* // SELECT uid,name FROM user WHERE uid>1 LIMIT 0,10 db.Model("user").Fileds("uid,name").Where("uid > ?", 1).Limit(0, 10).All() // 支持多种Where条件参数类型 // SELECT * FROM user WHERE uid=1 LIMIT 1 db.Model("user").Where("uid=1",).One() db.Model("user").Where("uid", 1).One() db.Model("user").Where("uid=?", 1).One() // SELECT * FROM user WHERE (uid=1) AND (name='john') LIMIT 1 db.Model("user").Where("uid", 1).Where("name", "john").One() db.Model("user").Where("uid=?", 1).And("name=?", "john").One() // SELECT * FROM user WHERE (uid=1) OR (name='john') LIMIT 1 db.Model("user").Where("uid=?", 1).Or("name=?", "john").One()
Where + slice
,预处理参数可直接通过slice
参数给定。
// SELECT * FROM user WHERE age>18 AND name like '%john%' db.Model("user").Where("age>? AND name like ?", g.Slice{18, "%john%"}).All() // SELECT * FROM user WHERE status=1 db.Model("user").Where("status=?", g.Slice{1}).All()
Where + map
,条件参数使用任意map
类型传递。
// SELECT * FROM user WHERE uid=1 AND name='john' LIMIT 1 db.Model("user").Where(g.Map{"uid" : 1, "name" : "john"}).One() // SELECT * FROM user WHERE uid=1 AND age>18 LIMIT 1 db.Model("user").Where(g.Map{"uid" : 1, "age>" : 18}).One()
Where + struct/*struct
,struct
标签支持 orm/json
,映射属性到字段名称关系。
type User struct { Id int `json:"uid"` UserName string `orm:"name"` } // SELECT * FROM user WHERE uid =1 AND name='john' LIMIT 1 db.Model("user").Where(User{ Id : 1, UserName : "john"}).One() // SELECT * FROM user WHERE uid =1 LIMIT 1 db.Model("user").Where(&User{ Id : 1}).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) db.Model("article").Where(condition).All()
WherePri
支持主键的查询条件
WherePri
方法的功能同Where
,但提供了对表主键的智能识别,常用于根据主键的便捷数据查询。假如user
表的主键为uid
,我们来看一下Where
与WherePri
的区别:
// WHERE `uid`=1 Where("uid", 1) WherePri(1) // WHERE `uid` IN(1,2,3) Where("uid", g.Slice{1,2,3}) WherePri(g.Slice{1,2,3})
可以看到,当使用WherePri
方法且给定参数为单一的参数基本类型或者slice
类型时,将会被识别为主键的查询条件值。
Content Menu
- No labels
5 Comments
echoyang
请问u.uid=1中的u是别名吗还是?
郭强
示例有问题,已修正
wangpengyun
数据库的索引和你传递的查询条件顺序有一定关系?
这个应该没关系吧。假如有表test,字段a上有索引,字段b没有索引,那么以下两种写法是等价的,mysql会自动优化,都会用到a索引。
select * from test where a=123 and b=234
select * from test where b=234 and a=123
郭强
是的,如果你传递的是
map
数据类型,条件的顺序是不固定的,但是MySQL会自动优化的,所以不影响。如果想要自己控制条件的先后顺序,可以不用map
数据类型传递条件参数。糖水不加糖
在sql语句前面加上一个Explain就能看到索引使用情况了.