一、QueryTable接口
1.1、QueryTable使用的两种方法
(1)、QueryTable按表名查询
// QueryTable使用方式一:按表名查询(将表名当参数传给QueryTable方法) qs := o.QueryTable("article")
(2)、QueryTable按模型名查询
// QueryTable使用方式二:模型struct方式 article := new(models.Article) qs := o.QueryTable(article)
1.2、QueryTable接口里的方法使用
(1)、One:一条数据
// 1、查询 “article” 表,然后通过Filter方法里指定的规则过滤,最后将查询结果里的第一条数据通过One方法存储到“&stu”变量里 o.QueryTable("article").Filter("name__exact","Zhiliao").One(&stu) // 2、指定显示的字段,在One方法里指定需要显示的字段(没指定的字段则不显示) o.QueryTable("article").Filter("name__exact","Zhiliao").One(&stu,"name","age")
(2)、Filter:包含条件
// 多个 Filter 之间使用 AND 连接 o.QueryTable("article").Filter("profile__isnull", true).Filter("name", "slene") 类sql: WHERE NOT profile_id IS NULL AND name = 'slene'
(3)、All:所有数据
返回符合查询条件的所有数据,最多可返回1000行数据,如果超过一千行则只返回一千行。
// 1、定义接收查询结果的变量 user_arr := []models.UserStruct{} // 2、返回符合条件的所有查询结果 o.QueryTable("article").Filter("name__exact","Zhiliao").All(&user_arr) // 3、也可以指定显示的字段(在All()方法里指定要显示的字段) qs.Filter("name__exact","Zhiliao").All(&user_arr,"name","age")
(4)、Exclude:排除条件
Exclude方法里的条件为不需要查询的条件
// 1、定义存放查询结果的变量 ret_articles := []models.Article{} // 2、Exclude(这里是Exclude方法要排除的条件) o.QueryTable("article").Exclude("title__exact", "xxx").All(&ret_articles) // 获取title不是xxx的所有数据
(5)、Limit:限制最大返回数据行数
- Limit(查询几条数据, 从哪里开始查询)
// Limit使用方法一:Limit(查询几条数据, 从哪里开始查询) o.QueryTable("article").Limit(3,0).All(&ret_articles) // Limit使用方法二(qs.Limit(查询几条数据).Offset(从哪里开始查询)) o.QueryTable("article").Limit(3).Offset(0).All(&ret_articles)
(6)、Offset:设置偏移数,即从什么位置开始查询
qs.Offset(20) // beego中使用: qs.Filter("name__isnull",false).Offset(1).All(&user_arr) 角标从0开始,代表第一条数据
(7)、GroupBy:分组
- 分组(qs.GroupBy("author"):根据author字段进行分组,author相同的字段为一个组)
- 注意:groupby必须放在orderby和limit之前使用
ret_articles := []test_orm.Article{} qs.GroupBy("author").All(&ret_articles)
(8)、OederBy:排序
-
参数使用 expr
-
ASC升序,字段名前面没有- :qs.OrderBy("age" ) 默认的
-
DESC降序,字段名前面有- :qs.OrderBy("-age" )
-
根据多个字段排序,用逗号隔开: qs.OrderBy("-age" ,“name”)
// 1、默认:升序排序 ret_articles := []test_orm.Article{} qs.OrderBy("read_count").All(&ret_articles) // 默认是升序(从小到大)排序 // 2、指定降序排序 qs.OrderBy("-read_count").All(&ret_articles) // 指定降序(DSC:从大到小)排序的方法为:在read_count字段前面加-号("-read_count") qs.OrderBy("-read_count", "-title").All(&ret_articles) // OrderBy支持多个字段,当第一个排序的字段值相同时会根据第二个字段的值排序
(9)、Distinct:去重,没有参数
根据指定字段去重,需要在all方法中指定去重的字段,否则根据所有字段去重
ret_articles := []test_orm.Article{} qs.Distinct().All(&ret_articles, "author") // 根据author字段去重
(10)、Count:统计个数,没有参数,后面不能跟查询条数的方法
有两个返回值,一个是数量,一个是错误
num, err := qs.Filter("author__exact", "施耐庵").Count() if err != nil { fmt.Println("Count failed, err:", err) } fmt.Println(num)
(11)、Exist:是否存在,没有参数,后面不能跟查询条数的方法
exist_ret := qs.Filter("author__exact", "施耐庵").Exist() if !exist_ret { fmt.Println("exist failed") } fmt.Println(exist_ret)
(12)、Update:根据当前查询条件更新
qs.Filter("id__exact", 5).Update(orm.Params{ "title": "优选工具", "author": "优选网络", "read_count": 99999, })
(13)、Delete:根据当前查询条件删除
num, err := qs.Filter("id__exact", 6).Delete() if err != nil { fmt.Println("delete data failed, err:", err) } fmt.Printf("成功删除了 %d 条数据\n", num)
(14)、PrepareInsert:插入
-
用于一次 prepare 多次 insert 插入
-
注意:最后要关闭 inserter
// 说明,这里没有自己造数据,而是查库里有的数据 // 1、定义接收查询数据的变量 ret_articles := []test_orm.Article{} // 2、查询数据,将数据存到变量里 num, err := qs.All(&ret_articles, "title", "author", "read_count") if err != nil { fmt.Println("query all data failed, err:", err) } fmt.Printf("query %d row data\n", num) // 3、多行插入数据 inster, _ := qs.PrepareInsert() for _, val := range ret_articles { id, err2 := inster.Insert(&val) if err != nil { fmt.Println("inster.Insert failed, err", err2) } fmt.Println("insert data id:", id) } //4、 插入完成后需要关闭插入对象 inster.Close()
(15)、Values:查询库里所有的数据放到一个切片里(切片里存的每条数据是一个map类型)
-
返回结果集的 key => value 值 , map存储
-
默认最大行数为 1000
-
暂不支持级联查询 RelatedSel 直接返回 Values
//1:定义变量(变量必须是orm.Params类型) var maps []orm.Params // 2、将查询的结果存到变量里 num, err := qs.Values(&maps) if err != nil { fmt.Println("qs.Values failed, err:", err) } fmt.Printf("qs.Values %d row data\n", num)
(16)、ValuesList:查询数据库里所有的数据,放到一个切片里(切片里存的每条数据是一个数组类型)
-
返回的结果集以slice存储
-
默认最大行数为 1000
-
返回的每个元素值以 string 保存
var lists []orm.ParamsList num, err := qs.ValuesList(&lists) if err != nil { fmt.Println("valuelist failed, err:", err) } fmt.Printf("valuelist %d row data\n", num)
(17)、ValuesFlat:查询表里指定某个字段的所有数据放到一个数组里
-
只返回特定的 Field 值,将结果集展开到单个 slice 里
-
默认最大行数为 1000
var list orm.ParamsList num, err := qs.ValuesFlat(&list, "title") if err != nil { fmt.Println("ValuesFlat failed, err:", err) } fmt.Println(num) fmt.Println(list)
二、Exper表达式
前面我们介绍了QueryTable方法查询表的方法了,但是没有介绍Filter里面的过滤规则,Exper表达式就是Filter方法里面的过滤规则,下面来看下过滤规则都有那些吧。
2.1、Exper表达式使用:
Exper表达式用两个下划线:“__” 后面跟表达式规则
2.2、Exper表达式操作符号
(1)、exact / iexact:等于,默认值,exact:大小写敏感 / iexact:大小写不敏感
// 获取文章title等于西游记的数据 o.QueryTable("article").Filter("title__exact", "西游记").One(&ret_article)
-
qs.Filter("name__exact","Zhiliao").One(&stu)
- where name = "Zhiliao" //where name = binary "Zhiliao" // 大小写敏感的关键字是binary
-
qs.Filter("name__iexact","Zhiliao").One(&stu)
- WHERE name LIKE 'Zhiliao' // link时,大小写不敏感
(2)、contains / icontains:包含,大小写敏感 / 不敏感
// 1、判断name是否包含“Zhil”,大小写敏感 qs.Filter("name__contains","Zhil").One(&stu) // sql语句为:WHERE name LIKE BINARY '%Zhil%' ,大小写敏感的关键字为binary // 2、判断name是否包含“Zhil”,大小写不敏感 qs.Filter("name__icontains","Zhil").One(&stu) // sql语句为:WHERE name LIKE '%Zhil%'
(3)、gt / gte:大于/大于等于
qs.Filter("age__gt",18).One(&stu) qs.Filter("age__gte",18).One(&stu)
(4)、lt / lte:小于/小于等于
qs.Filter("age__lt",18).One(&stu) qs.Filter("age__lte",18).One(&stu)
(5)、startswith / istartswith:以…起始,大小写敏感 / 不敏感
// 获取name字段以"Zh"开头,大小写敏感 qs.Filter("name__startswith","Zh").One(&stu) // sql语句为:WHERE name LIKE BINARY 'Zh%' // 获取name字段以"Zh"开头,大小写不敏感 qs.Filter("name__istartswith","Zh").One(&stu) // sql语句为:WHERE name LIKE 'Zh%'
(6)、endswith / iendswith:以…结束,大小写敏感 / 不敏感
// 获取name字段以“Liao”结尾的数据,大小写敏感 qs.Filter("name__endswith","Liao").One(&stu) // sql语句为:WHERE name LIKE BINARY '%Liao' // 获取name字段以“Liao”结尾的数据,大小写不敏感 qs.Filter("name__iendswith","Liao").One(&stu) // sql语句为:WHERE name LIKE '%Liao'
(7)、in:在某个范围中,值为不定长参数
// 获取age字段在“12,13,16,19”这个范围内的数据 qs.Filter("age__in",12,13,16,19).One(&stu) ids:=[]int{17,18,19,20} qs.Filter("age__in", ids)
(8)、isnull:为空,值为 true / false
数据库里为Null的字段查询,注意,Null字段和空字段不一样
// 获取表字段read_count字段为NULL的数据 qs.Filter("read_count__isnull", true).One(&ret_article) // true:表示IS NULL // 获取表字段read_count字段不为NULL的数据 qs.Filter("read_count__isnull", false).One(&ret_article) // false:表示IS NOT NULL