golang gorm(二)—gorm查询详解

微信扫一扫,分享到朋友圈

golang gorm(二)—gorm查询详解

这次对gorm的查询功能做一个详细的说明,我在数据库中添加了几条测试用的数据。

测试数据.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)
}
}

测试代码执行结果如下,数据库中的4条数据都被查询出来了。

查询所有.png

这里的 Find(&user) 相当于 select * from user 这条sql,具体查哪张表是根据你传入的结构体决定的,所以结构体名称必须和数据库对应,如果数据库中是下划线命名,结构体就转换成驼峰的形式,如:user_info为表名时,结构体名称应该为UserInfo。这里的 Find(&user) 还有一个作用就是把结果绑定至user中,所以这里一定要用指针作为参数传入。

根据主键查询

//根据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)
}

测试代码执行结果如下,数据库中id为1的数据被查询出来了。

根据id查询.png

给结构体中的主键字段设置了 gorm:"primary_key" json:"id" 后,gorm会根据user中的主键直接查询出对应的数据。

条件查询

//条件查询
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)
}
}

测试代码执行结果如下,数据库中age为18的两条数据被查询出来了。

条件查询.png

这里的 Where(keyWord+" = ?",keyValue) 相当于sql中的 where 表达式了,具体需要什么条件直接当作参数传入就行, 可以作为占位符,后面的参数中传入,有几个 ,后面可以传入多个参数来一一对应。

还有一种条件查询的方式,使用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)
}
}

测试代码执行结果如下,数据库中name为tom、age为18的数据被查询出来了。

map查询.png

这里map的key就是条件,value就是值,gorm会根据map中包含的键值对作为条件来查询,具体用哪种条件查询就看实际场景了。

其它查询选项

除了以上简单的查询还gorm同样支持检索数量limt()、排序order()、计数count()等,用法也很简单,我放一个例子应该就能明白

//使用limit限制返回条数为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)
}
}

测试代码执行结果如下,数据库中name为age为18的数据只返回了一条。

limit.png

其它的方式查询与limit同理,直接拼在查询条件中就可以了。

有疑问加站长微信联系

QQ音乐参与制定首个5G时代超高清音频标准,黑科技革新听歌体验

上一篇

iOS 从源码解析Runtime (六):由 rootAutorelease 函数引发的解读 AutoreleasePool

下一篇

你也可能喜欢

golang gorm(二)—gorm查询详解

长按储存图像,分享给朋友