beego Orm高级查询

beego Orm高级查询

环境

go1.14

预置条件

  1. 注册mysql驱动

  2. 注册database

  3. 定义User,并注册

    type User struct {
        ID int `orm:"column(id)"`
        Name string `orm:"column(name)"`
    }
    
    func (User)TableName()string{
        return "user"
    }
    
  4. 实验中的db为:db:=orm.NewOrm().QueryTable("user")

  5. 实验中的dbRaw为: dbRaw:=orm.NewOrm().Raw("select id from user where id in (1,2)")

实验:

  1. 使用All来获取多条数据

    users:=[]*User{}
    
    db.All(users)
    

    结果:取出所有user表的数据,All(users),users必须是注册时的User结构体,否则orm会panic

  2. 使用Filter来添加筛选条件

    users:=[]*User{}
    
    db.Filter("id__in",[]int{1,2}).All(users)
    

    结果:Filter的条件字段id必须与User结构体定义的column(id)一致,并且区分大小写,否则orm会panic

  3. 使用One获取一条数据

    user:=&User{}
    
    db.One(user)
    

    结果:只获取一条数据,One的参数不支持自定义的struct类型,必须是注册时的User结构体,否则会panic

  4. 使用Count()获取总数

    var count int 
    
    db.Count(&count)
    
  5. 使用ValuesFlat获取一列数据

    ids:=orm.ParamList{}
    
    db.ValuesFlat(&ids,"id")
    

    结果:orm.ParamList是一个[]interface{},获取指定id列的数据赋值到ids

    返回的[]interface{}, interface并不是注册Model时指定的类型,比如注册Model时id是int类型,这里的interface确是int64

  6. 使用Values获取多行数据

    users:=[]orm.Params{}
    
    dbRaw.Values(&users,"id")
    

    结果:通过raw获取数据,其中orm.Params是一个map[string]interface.将取得的数据按map[column]value存入切片,id可以指定查询的列

  7. 通过QueryRow取单条数据

    var count int
    
    orm.NewOrm().Raw(select  count(id) from user).QueryRow(&count)
    

    结果:QueryRow可以获取总条数,实现Count()

    var id int
    var name string
    
    orm.NewOrm().Raw(select  id,name from user).QueryRow(&id,&name)
    

    结果:查询id,name分别赋值给变量id和变量name

    user:=&User{}
    
    orm.NewOrm().Raw(select * from user).QueryRow(user)
    

    结果:支持struct,该struct可以自定义,不一定非得注册时的struct

  8. 使用QueryRows取多条数据

    var userIDs []int
    var userNames []string
    
    dbRaw.QueryRows(&userIDs,&userNames)
    

    结果:查询id,name分别赋值给userIDs,和userNames

    var users []*User{}
    
    dbRaw.QueryRows(&users)
    

    结果:查询多条数据,赋值给users切片

总结

  1. 使用orm.Setter的All和One方法,参数类型必须是注册Model时的struct,并且表名,还有字段名需要严格对应
  2. 使用ValueFlag方法返回的interface切片,其interface的类型跟注册时的类型无关。
  3. Raw的QueryRow和QueryRows,可传多个切片类型的参数,对应查询的多个字段,也支持传struct,并且该struct类型不必须是注册的Model结构体
  4. 可以使用QueryRows来查询单列,与其使用ValueFlag返回interface再进行转换,不如使用Raw的QueryRows直接获取指定类型的数据
上一篇:用类加载器的5种方式读取.properties文件


下一篇:Beego环境搭建和bee工具安装使用(绝对可成功)