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