分享
  1. 首页
  2. 文章

golang gorm(二)---gorm查询详解

lannisiter · · 9561 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

这次对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同理,直接拼在查询条件中就可以了。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:lannisiter

查看原文:golang gorm(二)---gorm查询详解

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
9561 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏