beego ORM 的高级操作
ORM 以 QuerySeter
来组织查询,每个返回 QuerySeter 的方法都会获得一个新的 QuerySeter 对象。
新建一个 ormer 对象
o := orm.NewOrm() // ormer对象的接口
type Ormer interface {
Read(interface{}, …string) error
ReadOrCreate(interface{}, string, …string) (bool, int64, error)
Insert(interface{}) (int64, error)
InsertMulti(int, interface{}) (int64, error)
Update(interface{}, …string) (int64, error)
Delete(interface{}) (int64, error)
LoadRelated(interface{}, string, …interface{}) (int64, error)
QueryM2M(interface{}, string) QueryM2Mer
QueryTable(interface{}) QuerySeter
Using(string) error
Begin() error
Commit() error
Rollback() error
Raw(string, …interface{}) RawSeter
Driver() Driver
}
得到一个 queryseter 对象
qs := o.QueryTable("表名") 得到一个 QuerySeter 对象
type QuerySeter interface {
Filter(string, …interface{}) QuerySeter
Exclude(string, …interface{}) QuerySeter
SetCond(*Condition) QuerySeter
Limit(int, …int64) QuerySeter
Offset(int64) QuerySeter
GroupBy(…string) QuerySeter
OrderBy(…string) QuerySeter
Distinct() QuerySeter
RelatedSel(…interface{}) QuerySeter
Count() (int64, error)
Exist() bool
Update(Params) (int64, error)
Delete() (int64, error)
PrepareInsert() (Inserter, error)
All(interface{}, …string) (int64, error)
One(interface{}, …string) error
Values(*[]Params, …string) (int64, error)
ValuesList(*[]ParamsList, …string) (int64, error)
ValuesFlat(*ParamsList, string) (int64, error)
}
orm 的 增删改查
package main
import (
"github.com/astaxie/beego/orm"
"go_spider/models"
)
func init() {
models.RegisterDB()
}
func main() {
orm.Debug = true
//orm.RunSyncdb("default",false,true)
o := orm.NewOrm()
//o.Using("db1")
o.Using("default")
// update
//user := models.Student{Id:1}
//if o.Read(&user) == nil {
// user.Name = "MyName123"
// user.Hobby = "eat"
// if num, err := o.Update(&user,"Name","Hobby"); err == nil {
// //if num, err := o.Update(&user); err == nil {
// fmt.Println(num)
// }
//}
// 查找 read()
//user := models.User{Name:"selena"}
//
//err := o.Read(&user,"Name") // 通过其他字段进行 查找
//if err == orm.ErrNoRows{
// fmt.Println("查询不到")
//}else if err == orm.ErrMissPK{
// fmt.Println("找不到主键")
//}else {
// fmt.Println(user.Id, user.Profile.Age)
//user := models.User{Name:"ally"}
//created, id, err := o.ReadOrCreate(&user,"Name");
//fmt.Println(created,id,err)
// 批量插入
//users := []models.Student{
// {Name:"a"},
// {Name:"aa"},
// {Name:"a1"},
// {Name:"a4"},
//}
//successNums, err := o.InsertMulti(100,users)
//fmt.Println(successNums,err)
//if num, err := o.Delete(&models.Student{Id:1}); err == nil {
// fmt.Println(num)
//}
//user := models.User{Id:1}
//o.Read(&user)
//
//var maps []orm.Params
//num, err := o.QueryTable("tag").Values(&maps)
//fmt.Println(num,err,maps)
//post := new(models.Post)
//
//post.Title = "hello go"
//post.User = &user
//post.Tags =
//user := new(models.User)
//user.Profile = &profile1
}
//res, err = p.Exec("testing", "astaxie")
//res, err := p.Exec("testing", "slene")
//p, err := o.Raw("UPDATE user SET name = ? WHERE name = ?").Prepare()
//
//用于一次 prepare 多次 exec,以提高批量执行的速度。
//p.Exec([]int{4,5,6})
//p.Exec(ids)
//p, _ := o.Raw(`SELECT * FROM user WHERE id IN (?,?,?)`).Prepare()
//ids := []int{1,2,3}
// Prepare()
//fmt.Println(res,err,users)
//res, err := o.Raw(sql,ids).QueryRows(&users) // 获取得到的结果
//sql := `SELECT * FROM user WHERE id IN (?,?,?)`
//ids := []int{1,2,3}
//var users []models.User
//fmt.Println(res,err,users)
//res, err := o.Raw(sql,ids).Exec() // 执行
//sql := `SELECT * FROM user WHERE id IN (?,?,?)`
//ids := []int{1,2,3}
//var users []models.User
// ======================= 原生SQL 查询 ======================//
//fmt.Println(num,err)
//num, err := m2m.Count() // 获取 所有的关联数量
//m2m := o.QueryM2M(&post,"Tags")
//
//fmt.Println(num,err)
//num, err := m2m.Clear() // 删除 所有的关联
//m2m := o.QueryM2M(&post,"Tags")
//fmt.Println(ret)
//ret := m2m.Exist(&models.Tag{Id:1})
//
//m2m := o.QueryM2M(&post, "Tags")
// 查看 某个标签是否在 对应的关系中
//o.Read(&post)
//post := models.Post{Id:1}
o.QueryTable("post").Filter("id",2).One(&post)
post := models.Post{}
//m2m.Remove(tags)
//
//m2m := o.QueryM2M(&post,"Tags")
//
//qs.Filter("id__gt",8).All(&tags)
//qs := o.QueryTable("tag")
//
//tags := []*models.Tag{}
//
//
//o.Read(&post)
//post := models.Post{Id:3}
// 删除 多个对象
//
//m2m.Add(tags1)
//qs.Filter("id__gt",5).All(&tags1)
//qs := o.QueryTable("tag")
//tags1 := []*models.Tag{}
//m2m := o.QueryM2M(&post,"Tags")
//post :=models.Post{Id:2}
// 3 先查询 要操作的 tags 再加入
//m2m.Add(tags)
//o.InsertMulti(100,&tags)
//}
// {Name:"lua"},
// {Name:"php"},
// {Name:"python"},
//tags := []*models.Tag{
//
//m2m := o.QueryM2M(&post,"Tags")
//post :=models.Post{Id:2}
// 2 批量加入 失败 insertbulk
//m2m.Add(tags)
//o.Insert(&tags)
//tags := models.Tag{Name:"java"}
//
//m2m := o.QueryM2M(&post,"Tags")
//post :=models.Post{Id:3}
// 1 加入一个
//}
// fmt.Println(num)
//if err == nil {
//num, err := m2m.Add(tag)
//o.Insert(&tag)
//tag := &models.Tag{Name:"golang"}
//
//m2m := o.QueryM2M(&post,"Tags")
//post := models.Post{Id:1}
// 创建一个多对多的 对象
//fmt.Println(o.Insert(user))
//fmt.Println(o.Insert(profile))
//
//user.Name = "selena"
//user.Profile = profile
//user := new(models.User)
//
//
//profile.Age = 30
//profile := new(models.Profile)
//fmt.Println(err, num)
//
//num, err := o.LoadRelated(&post, "Tags")
//err := o.Read(&post)
//post := models.Post{Id: 1}
//
//}
//
// }
// }
// fmt.Println(tag.Name)
// for _, tag := range tags {
// if err == nil {
// _, err := o.QueryTable("tag").Filter("Posts__Post__Title","hello go").All(&tags)
// tags := []*models.Tag{}
// 多对多 2
//}
// }
// fmt.Println(post.Title)
// for _,post := range posts {
//if err ==nil {
//
//_, err := o.QueryTable("post").Filter("Tags__Tag__Name","blue").All(&posts)
//var posts []*models.Post
//
// 多查多 1
//}
// }
// fmt.Println(post.Id,post.User,post.User.Name)
// for _, post := range posts {
// fmt.Println("posts nums:", num)
//if err == nil {
//num, err := o.QueryTable("post").Filter("User",1).RelatedSel().All(&posts)
//var posts []*models.Post
// 一查多
//fmt.Println(profile)
//fmt.Println(profile)
//
//}
//panic(err)
//if err != nil {
//
//err := o.QueryTable("profile").Filter("user__id",1).One(&profile)
//
//var profile models.Profile
//
//
//fmt.Println(user.Profile.User)
//fmt.Println(user.Profile)
//o.QueryTable("user").Filter("Id",1).RelatedSel().One(user)
//
////fmt.Println(user.Profile)
////
////}
////o.Read(user.Profile)
////if user.Profile != nil {
////o.Read(&user)
//user := &models.User{}
//4 接收者 orm.ParamsList----方法 ValuesFlat [selena ally bob cac appe] orm.ParamsList
//fmt.Println(maps,reflect.TypeOf(maps))
//qs.ValuesFlat(&maps,"name")
//var maps orm.ParamsList
// 3 接收者[]models.User----方法All [{1 selena <nil> []} {2 ally <nil> []} {3 bob <nil> []} {4 cac <nil> []} {5 appe <nil> []}] []models.User
//fmt.Println(maps,reflect.TypeOf(maps))
//qs.All(&maps,"id","name")
//var maps []models.User
//
// 2 接收者[]orm.Params----方法Values [map[Id:1 Name:selena] map[Id:2 Name:ally] map[Id:3 Name:bob] map[Id:4 Name:cac] map[Id:5 Name:appe]] []orm.Params
//fmt.Println(maps,reflect.TypeOf(maps))
//qs.Values(&maps,"id","name")
//var maps []orm.Params
// 1 接受者[]orm.ParamsList----方法ValuesList [[1 selena] [2 ally] [3 bob] [4 cac] [5 appe]] []orm.ParamsList
//fmt.Println(maps,reflect.TypeOf(maps))
//qs.ValuesList(&maps,"id","name")
//var maps []orm.ParamsList
//var DefaultRelsDepth int = 5
//fmt.Println(nums, err)
//nums, err := qs.SetCond(cond1).Count()
//
//cond1 := cond.And("profile__isnull",false).AndNot("name__isnull",true).Or("profile__age__gt",200)
//cond := orm.NewCondition()
//
//qs.Filter("name__iexact","ele").All(&users)
//
//qs.Filter("profile__age__in",45,60).Exclude("profile__id__gt",10).One(&user)
//
//qs.Filter("profile__age__in",45,60).One(&user)
//qs.Filter("profile__age__gte",45).One(&user)
//qs.Filter("profile__age",63).One(&user)
//qs.Filter("id",1).One(&user)
//var users []models.User
//var user models.User
//qs := o.QueryTable("user")
//o.Insert(user)
//