go语言web开发19 - beego框架之go orm使用04 - orm的QueryTable接口与exper表达式


一、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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM