美文网首页
golang gorm(二)---gorm查询详解

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

作者: lannisiter | 来源:发表于2020-09-27 16:22 被阅读0次

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

    相关文章

      网友评论

          本文标题:golang gorm(二)---gorm查询详解

          本文链接:https://www.haomeiwen.com/subject/wmbkuktx.html