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