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

查詢所有
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ù)都被查詢出來了。

這里的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ù)被查詢出來了。

給結(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ù)被查詢出來了。

這里的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的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同理,直接拼在查詢條件中就可以了。