beego orm使用流程:
0. 导入包
orm + dbdriver
"github.com/astaxie/beego/orm" _ "github.com/go-sql-driver/mysql"
1. 注册驱动
orm.RegisterDriver("mysql", orm.DRMySQL) // 可省略
2. 注册数据库
orm.RegisterDataBase("default", "mysql", dsn)
3. 定义数据模型
以UserModel为例:
type UserModel struct {
ID int `orm:"column(id)"`
Name string `orm:"size(64)" `
Password string `orm:"size(1024)"`
Gender string `orm:""`
Height float32 `orm:""`
Tel string `orm:""`
Birthday *time.Time `orm:"type(date)"`
CreatedAt *time.Time `orm:"auto_now_add"`
UpdatedAt *time.Time `orm:"auto_now"`
DeletedAt *time.Time `orm:"null"`
}
4. 注册数据模型
orm.RegisterModel(new(UserModel))
5. 操作
(1)同步表结构
模式1:RunCommand
s1:orm.RunCommand()
s2:命令行中使用 orm syncdb(包含多种命令)

模式2:RunSyncdb
orm.RunSyncdb(name,force,verbose) //name: 数据库别名;force: drop table 后再建表(true/false);verbose: 执行打印过程(true/false)

(2)数据:增,删,改,查
获取数据库连接:ormer := orm.NewOrm()
增加:ormer.insert(&User{.....})
删除:ormer.delete(&User{ID:...})
更新:ormer.Update(&User{ID:...},field1,field2...)
查询:ormer.Read(&User{....}) //查找时,请确保所用字段或者多个字段组合为唯一的存在
结果集:
方式1:querySet := ormer.QueryTable(dbname) //不推荐使用,因为dbname有可能会更改
方式2:querySet := ormer.QueryTable(&User{})
querySet.Count() => 查询数据量
querySet.All(&users) (var users []*User) => 查询所有数据
querySet 中的where查询:querySet.Filter(列名__条件,对象)
条件:
(1)关系:=([i]exact), <(lt), >(gt), >=(gte), <=(lte)
in(in)
like %content%([i]contains) start%([i]startwith) %end([i]endwith)
queryset.Exclude(列名__条件,对象) // 排除特定条件下的查询结果
queryset.Limit(m).Offset(n).All(&users) //分页查询:每页m个
queryset.OrderBy(field_name).All(&users) // 按字段field_name升序排列
queryset.OrderBy(-field_name).All(&users) // 按字段field_name降序排列
queryset.OrderBy(field_name1,field_name2....).All(&users) // 按多个字段排列
queryset.OrderBy(field_name1,field_name2....).One(&users) // 只查一条数据出来
复杂的查询条件:
orm.NewCondition()
【请验证】
使用querySeter(querySeter=new(QuerySet))进行查询条件时需要注意:
当使用QueryTable获取querySeter时,再在querySeter进行Filter查询/SetCond查询,必须是进行整体的组合查询,而不能单独进行查询,以下用代码解释:
querySeter = orm.QueryTable(new(User))
querySeter = querySeter.Filter("name__exact", "Peter")
querySeter = querySeter.Filter("Job__exact", "Manger")
以上代码最终的结果 ≠ querySeter = querySeter.Filter("name__exact", "Peter").Filter("Job__exact", "Manger") ( 多个 Filter 之间使用 AND 连接 )
因为最开始Filter查询后,再次Filter,无法将上一次的查询条件合并到第二次的查询条件中
参考文章:
【5】beego/beedoc -- QuerySeter的使用
【6】Beego ORM中QueryTable源码 -- 475行 QuerySeter 接口源码 -- 272行(请详看,附带示例代码)
【8】ORM标签