beego orm使用流程:
0. 導(dǎo)入包
? ? orm? +? dbdriver
? ??"github.com/astaxie/beego/orm"? ? ? _ "github.com/go-sql-driver/mysql"
1. 注冊(cè)驅(qū)動(dòng)
? ? orm.RegisterDriver("mysql", orm.DRMySQL)? // 可省略
2. 注冊(cè)數(shù)據(jù)庫
? ?orm.RegisterDataBase("default", "mysql", dsn)
3. 定義數(shù)據(jù)模型
以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. 注冊(cè)數(shù)據(jù)模型
? ?orm.RegisterModel(new(UserModel))
5. 操作
? ? ? ? ? ?(1)同步表結(jié)構(gòu)
模式1:RunCommand
? ? ? ? ? ? ? ? ? s1:orm.RunCommand()
? ? ? ? ? ? ? ? ? s2:命令行中使用 orm syncdb(包含多種命令)

模式2:RunSyncdb
orm.RunSyncdb(name,force,verbose) //name: 數(shù)據(jù)庫別名;force: drop table 后再建表(true/false);verbose: 執(zhí)行打印過程(true/false)

??(2)數(shù)據(jù):增,刪,改,查
獲取數(shù)據(jù)庫連接:ormer := orm.NewOrm()
增加:ormer.insert(&User{.....})
刪除:ormer.delete(&User{ID:...})?
更新:ormer.Update(&User{ID:...},field1,field2...)??
查詢:ormer.Read(&User{....})? //查找時(shí),請(qǐng)確保所用字段或者多個(gè)字段組合為唯一的存在
結(jié)果集:
? ? 方式1:querySet? :=? ormer.QueryTable(dbname) //不推薦使用,因?yàn)閐bname有可能會(huì)更改
? ?方式2:querySet? :=? ormer.QueryTable(&User{})
querySet.Count()? ?=> 查詢數(shù)據(jù)量
querySet.All(&users)? ? ?(var users []*User)? ?=> 查詢所有數(shù)據(jù)
querySet 中的where查詢:querySet.Filter(列名__條件,對(duì)象)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?條件:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (1)關(guān)系:=([i]exact),? <(lt),? >(gt),? >=(gte),? ?<=(lte)? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? in(in)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? like? %content%([i]contains)? start%([i]startwith)? %end([i]endwith)
queryset.Exclude(列名__條件,對(duì)象)? // 排除特定條件下的查詢結(jié)果
queryset.Limit(m).Offset(n).All(&users)? //分頁查詢:每頁m個(gè)
queryset.OrderBy(field_name).All(&users) // 按字段field_name升序排列
queryset.OrderBy(-field_name).All(&users) // 按字段field_name降序排列
queryset.OrderBy(field_name1,field_name2....).All(&users) // 按多個(gè)字段排列
queryset.OrderBy(field_name1,field_name2....).One(&users) // 只查一條數(shù)據(jù)出來
復(fù)雜的查詢條件:
orm.NewCondition()
【請(qǐng)驗(yàn)證】
使用querySeter(querySeter=new(QuerySet))進(jìn)行查詢條件時(shí)需要注意:
當(dāng)使用QueryTable獲取querySeter時(shí),再在querySeter進(jìn)行Filter查詢/SetCond查詢,必須是進(jìn)行整體的組合查詢,而不能單獨(dú)進(jìn)行查詢,以下用代碼解釋:
querySeter = orm.QueryTable(new(User))
querySeter = querySeter.Filter("name__exact", "Peter")
querySeter = querySeter.Filter("Job__exact", "Manger")
以上代碼最終的結(jié)果 ≠?querySeter = querySeter.Filter("name__exact", "Peter").Filter("Job__exact", "Manger") ( 多個(gè) Filter 之間使用 AND 連接 )
因?yàn)樽铋_始Filter查詢后,再次Filter,無法將上一次的查詢條件合并到第二次的查詢條件中
參考文章:
【0】?beedoc -- model 官方最權(quán)威
【2】beego框架圖文簡(jiǎn)介講解 -- ORM框架
【4】beego/beedoc -- 關(guān)于orm使用的說明
【5】beego/beedoc -- QuerySeter的使用
【6】Beego ORM中QueryTable源碼 -- 475行? ? ? ? ? ?QuerySeter 接口源碼 -- 272行(請(qǐng)?jiān)斂矗綆纠a)
【7】beego ORM 高級(jí)查詢 + 原生SQL查詢
【8】ORM標(biāo)簽