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

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

这次对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

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