beego Orm高级查询
环境
go1.14
预置条件
-
注册mysql驱动
-
注册database
-
定义User,并注册
type User struct { ID int `orm:"column(id)"` Name string `orm:"column(name)"` } func (User)TableName()string{ return "user" }
-
实验中的db为:
db:=orm.NewOrm().QueryTable("user")
-
实验中的dbRaw为:
dbRaw:=orm.NewOrm().Raw("select id from user where id in (1,2)")
实验:
-
使用All来获取多条数据
users:=[]*User{} db.All(users)
结果:取出所有user表的数据,All(users),users必须是注册时的User结构体,否则orm会panic
-
使用Filter来添加筛选条件
users:=[]*User{} db.Filter("id__in",[]int{1,2}).All(users)
结果:Filter的条件字段
id
必须与User结构体定义的column(id)
一致,并且区分大小写,否则orm会panic -
使用One获取一条数据
user:=&User{} db.One(user)
结果:只获取一条数据,One的参数不支持自定义的struct类型,必须是注册时的User结构体,否则会panic
-
使用Count()获取总数
var count int db.Count(&count)
-
使用ValuesFlat获取一列数据
ids:=orm.ParamList{} db.ValuesFlat(&ids,"id")
结果:orm.ParamList是一个[]interface{},获取指定id列的数据赋值到ids
返回的[]interface{}, interface并不是注册Model时指定的类型,比如注册Model时id是int类型,这里的interface确是int64
-
使用Values获取多行数据
users:=[]orm.Params{} dbRaw.Values(&users,"id")
结果:通过raw获取数据,其中orm.Params是一个map[string]interface.将取得的数据按map[column]value存入切片,
id
可以指定查询的列 -
通过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
-
使用QueryRows取多条数据
var userIDs []int var userNames []string dbRaw.QueryRows(&userIDs,&userNames)
结果:查询id,name分别赋值给userIDs,和userNames
var users []*User{} dbRaw.QueryRows(&users)
结果:查询多条数据,赋值给users切片
总结
- 使用orm.Setter的All和One方法,参数类型必须是注册Model时的struct,并且表名,还有字段名需要严格对应
- 使用ValueFlag方法返回的interface切片,其interface的类型跟注册时的类型无关。
- Raw的QueryRow和QueryRows,可传多个切片类型的参数,对应查询的多个字段,也支持传struct,并且该struct类型不必须是注册的Model结构体
- 可以使用QueryRows来查询单列,与其使用ValueFlag返回interface再进行转换,不如使用Raw的QueryRows直接获取指定类型的数据