go语⾔web开发19-beego框架之goorm使⽤04-orm的
QueryTable接。。。
⼀、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 插⼊
注意:最后要关闭 insertergo语言开发环境搭建
// 说明,这⾥没有⾃⼰造数据,⽽是查库⾥有的数据
// 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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。