golang gorm(二)---gorm查詢詳解

這次對gorm的查詢功能做一個詳細(xì)的說明,我在數(shù)據(jù)庫中添加了幾條測試用的數(shù)據(jù)。

測試數(shù)據(jù).png

查詢所有

type User struct {
    Id      int     `gorm:"primary_key" json:"id"`
    Name    string  `json:"name"`
    Age     int     `json:"age"`
    Gender  int     `json:"gender"`     //1:男、2:女
}

//查詢所有
func (User) FindAll() (user []User){
    conn := db.GetDb()
    defer conn.Close()

    conn.Find(&user)  //select * from user
    return
}

//測試
func TestFindAll(t *testing.T) {
    user := new(entity.User)
    users := user.FindAll()
    for _,v := range users {
        fmt.Println(v)
    }
}

測試代碼執(zhí)行結(jié)果如下,數(shù)據(jù)庫中的4條數(shù)據(jù)都被查詢出來了。

查詢所有.png

這里的Find(&user)相當(dāng)于select * from user這條sql,具體查哪張表是根據(jù)你傳入的結(jié)構(gòu)體決定的,所以結(jié)構(gòu)體名稱必須和數(shù)據(jù)庫對應(yīng),如果數(shù)據(jù)庫中是下劃線命名,結(jié)構(gòu)體就轉(zhuǎn)換成駝峰的形式,如:user_info為表名時,結(jié)構(gòu)體名稱應(yīng)該為UserInfo。這里的Find(&user)還有一個作用就是把結(jié)果綁定至user中,所以這里一定要用指針作為參數(shù)傳入。

根據(jù)主鍵查詢

//根據(jù)id查詢
func (user *User) FindById(){
    conn := db.GetDb()
    defer conn.Close()

    conn.Find(&user)
    return
}

//測試代碼
func TestFindById(t *testing.T) {
    user := new(entity.User)
    user.Id = 1
    user.FindById()
    fmt.Println(user)
}

測試代碼執(zhí)行結(jié)果如下,數(shù)據(jù)庫中id為1的數(shù)據(jù)被查詢出來了。

根據(jù)id查詢.png

給結(jié)構(gòu)體中的主鍵字段設(shè)置了 gorm:"primary_key" json:"id"后,gorm會根據(jù)user中的主鍵直接查詢出對應(yīng)的數(shù)據(jù)。

條件查詢

//條件查詢
func (User) FindByCondition(keyWord, keyValue string) (user User){
    conn := db.GetDb()
    defer conn.Close()

    conn.Where(keyWord+" = ?",keyValue).Find(&user)
    return
}

//測試代碼
func TestFindByCondition(t *testing.T) {
    keyWord := "age"
    keyValue := "18"
    users := entity.User{}.FindByCondition(keyWord, keyValue)
    for _,v := range users {
        fmt.Println(v)
    }
}

測試代碼執(zhí)行結(jié)果如下,數(shù)據(jù)庫中age為18的兩條數(shù)據(jù)被查詢出來了。

條件查詢.png

這里的Where(keyWord+" = ?",keyValue) 相當(dāng)于sql中的where表達(dá)式了,具體需要什么條件直接當(dāng)作參數(shù)傳入就行,可以作為占位符,后面的參數(shù)中傳入,有幾個?,后面可以傳入多個參數(shù)來一一對應(yīng)。

還有一種條件查詢的方式,使用map的k,v來作為條件和值

//map查詢
func (User) FindByMap(condition map[string]interface{}) (user []User) {
    conn := db.GetDb()
    defer conn.Close()

    conn.Where(condition).Find(&user)
    return
}
//測試
func TestFindByMap(t *testing.T) {
    users := entity.User{}.FindByMap(map[string]interface{}{"name": "tom", "age": 18})
    for _,v := range users {
        fmt.Println(v)
    }
}

測試代碼執(zhí)行結(jié)果如下,數(shù)據(jù)庫中name為tom、age為18的數(shù)據(jù)被查詢出來了。

map查詢.png

這里map的key就是條件,value就是值,gorm會根據(jù)map中包含的鍵值對作為條件來查詢,具體用哪種條件查詢就看實(shí)際場景了。

其它查詢選項(xiàng)

除了以上簡單的查詢還gorm同樣支持檢索數(shù)量limt()、排序order()、計數(shù)count()等,用法也很簡單,我放一個例子應(yīng)該就能明白

//使用limit限制返回條數(shù)為1
func (User) FindUsers(keyWord, keyValue string) (user []User){
    conn := db.GetDb()
    defer conn.Close()

    conn.Where(keyWord+" = ?",keyValue).Limit(1).Find(&user)
    return
}
//測試age為18的記錄(2條)
func TestFindUsers(t *testing.T) {
    keyWord := "age"
    keyValue := "18"
    users := entity.User{}.FindUsers(keyWord,keyValue)
    for _,v := range users {
        fmt.Println(v)
    }
}

測試代碼執(zhí)行結(jié)果如下,數(shù)據(jù)庫中name為age為18的數(shù)據(jù)只返回了一條。

limit.png

其它的方式查詢與limit同理,直接拼在查詢條件中就可以了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容