zh docs update
Showing
5 changed files
with
497 additions
and
411 deletions
| ... | @@ -8,108 +8,110 @@ note: 根据文档的更新,随时都可能更新这个 Model | ... | @@ -8,108 +8,110 @@ note: 根据文档的更新,随时都可能更新这个 Model |
| 8 | 8 | ||
| 9 | ##### models.go: | 9 | ##### models.go: |
| 10 | 10 | ||
| 11 | package main | 11 | ```go |
| 12 | 12 | package main | |
| 13 | import ( | 13 | |
| 14 | "github.com/astaxie/beego/orm" | 14 | import ( |
| 15 | "time" | 15 | "github.com/astaxie/beego/orm" |
| 16 | ) | 16 | "time" |
| 17 | 17 | ) | |
| 18 | type User struct { | 18 | |
| 19 | Id int `orm:"auto"` // 设置为auto主键 | 19 | type User struct { |
| 20 | UserName string `orm:"size(30);unique"` // 设置字段为unique | 20 | Id int `orm:"auto"` // 设置为auto主键 |
| 21 | Email string `orm:"size(100)"` // 设置string字段长度时,会使用varchar类型 | 21 | UserName string `orm:"size(30);unique"` // 设置字段为unique |
| 22 | Password string `orm:"size(100)"` | 22 | Email string `orm:"size(100)"` // 设置string字段长度时,会使用varchar类型 |
| 23 | Status int16 `orm:"choices(0,1,2,3);defalut(0)"` // choices设置可选值 | 23 | Password string `orm:"size(100)"` |
| 24 | IsStaff bool `orm:"default(false)"` // default设置默认值 | 24 | Status int16 `orm:"choices(0,1,2,3);defalut(0)"` // choices设置可选值 |
| 25 | IsActive bool `orm:"default(0)"` | 25 | IsStaff bool `orm:"default(false)"` // default设置默认值 |
| 26 | Created time.Time `orm:"auto_now_add;type(date)"` // 创建时自动设置时间 | 26 | IsActive bool `orm:"default(0)"` |
| 27 | Updated time.Time `orm:"auto_now"` // 每次更新时自动设置时间 | 27 | Created time.Time `orm:"auto_now_add;type(date)"` // 创建时自动设置时间 |
| 28 | Profile *Profile `orm:"null;rel(one);on_delete(set_null)"` // OneToOne relation, 级联删除时设置为NULL | 28 | Updated time.Time `orm:"auto_now"` // 每次更新时自动设置时间 |
| 29 | Posts []*Post `orm:"reverse(many)" json:"-"` // fk 的反向关系 | 29 | Profile *Profile `orm:"null;rel(one);on_delete(set_null)"` // OneToOne relation, 级联删除时设置为NULL |
| 30 | orm.Manager `json:"-"` // 每个model都需要定义orm.Manager | 30 | Posts []*Post `orm:"reverse(many)" json:"-"` // fk 的反向关系 |
| 31 | } | 31 | orm.Manager `json:"-"` // 每个model都需要定义orm.Manager |
| 32 | 32 | } | |
| 33 | // 定义NewModel进行orm.Manager的初始化(必须) | 33 | |
| 34 | func NewUser() *User { | 34 | // 定义NewModel进行orm.Manager的初始化(必须) |
| 35 | obj := new(User) | 35 | func NewUser() *User { |
| 36 | obj.Manager.Init(obj) | 36 | obj := new(User) |
| 37 | return obj | 37 | obj.Manager.Init(obj) |
| 38 | } | 38 | return obj |
| 39 | 39 | } | |
| 40 | type Profile struct { | 40 | |
| 41 | Id int `orm:"auto"` | 41 | type Profile struct { |
| 42 | Age int16 `` | 42 | Id int `orm:"auto"` |
| 43 | Money float64 `` | 43 | Age int16 `` |
| 44 | User *User `orm:"reverse(one)" json:"-"` // 设置反向关系(字段可选) | 44 | Money float64 `` |
| 45 | orm.Manager `json:"-"` | 45 | User *User `orm:"reverse(one)" json:"-"` // 设置反向关系(字段可选) |
| 46 | } | 46 | orm.Manager `json:"-"` |
| 47 | 47 | } | |
| 48 | func (u *Profile) TableName() string { | 48 | |
| 49 | return "profile" // 自定义表名 | 49 | func (u *Profile) TableName() string { |
| 50 | } | 50 | return "profile" // 自定义表名 |
| 51 | 51 | } | |
| 52 | func NewProfile() *Profile { | 52 | |
| 53 | obj := new(Profile) | 53 | func NewProfile() *Profile { |
| 54 | obj.Manager.Init(obj) | 54 | obj := new(Profile) |
| 55 | return obj | 55 | obj.Manager.Init(obj) |
| 56 | } | 56 | return obj |
| 57 | 57 | } | |
| 58 | type Post struct { | 58 | |
| 59 | Id int `orm:"auto"` | 59 | type Post struct { |
| 60 | User *User `orm:"rel(fk)"` // RelForeignKey relation | 60 | Id int `orm:"auto"` |
| 61 | Title string `orm:"size(60)"` | 61 | User *User `orm:"rel(fk)"` // RelForeignKey relation |
| 62 | Content string `` | 62 | Title string `orm:"size(60)"` |
| 63 | Created time.Time `` | 63 | Content string `` |
| 64 | Updated time.Time `` | 64 | Created time.Time `` |
| 65 | Tags []*Tag `orm:"rel(m2m)"` // ManyToMany relation | 65 | Updated time.Time `` |
| 66 | orm.Manager `json:"-"` | 66 | Tags []*Tag `orm:"rel(m2m)"` // ManyToMany relation |
| 67 | } | 67 | orm.Manager `json:"-"` |
| 68 | 68 | } | |
| 69 | func NewPost() *Post { | 69 | |
| 70 | obj := new(Post) | 70 | func NewPost() *Post { |
| 71 | obj.Manager.Init(obj) | 71 | obj := new(Post) |
| 72 | return obj | 72 | obj.Manager.Init(obj) |
| 73 | } | 73 | return obj |
| 74 | 74 | } | |
| 75 | type Tag struct { | 75 | |
| 76 | Id int `orm:"auto"` | 76 | type Tag struct { |
| 77 | Name string `orm:"size(30)"` | 77 | Id int `orm:"auto"` |
| 78 | Status int16 `orm:"choices(0,1,2);default(0)"` | 78 | Name string `orm:"size(30)"` |
| 79 | Posts []*Post `orm:"reverse(many)" json:"-"` | 79 | Status int16 `orm:"choices(0,1,2);default(0)"` |
| 80 | orm.Manager `json:"-"` | 80 | Posts []*Post `orm:"reverse(many)" json:"-"` |
| 81 | } | 81 | orm.Manager `json:"-"` |
| 82 | 82 | } | |
| 83 | func NewTag() *Tag { | 83 | |
| 84 | obj := new(Tag) | 84 | func NewTag() *Tag { |
| 85 | obj.Manager.Init(obj) | 85 | obj := new(Tag) |
| 86 | return obj | 86 | obj.Manager.Init(obj) |
| 87 | } | 87 | return obj |
| 88 | 88 | } | |
| 89 | type Comment struct { | 89 | |
| 90 | Id int `orm:"auto"` | 90 | type Comment struct { |
| 91 | Post *Post `orm:"rel(fk)"` | 91 | Id int `orm:"auto"` |
| 92 | Content string `` | 92 | Post *Post `orm:"rel(fk)"` |
| 93 | Parent *Comment `orm:"null;rel(fk)"` // null设置allow NULL | 93 | Content string `` |
| 94 | Status int16 `orm:"choices(0,1,2);default(0)"` | 94 | Parent *Comment `orm:"null;rel(fk)"` // null设置allow NULL |
| 95 | Created time.Time `orm:"auto_now_add"` | 95 | Status int16 `orm:"choices(0,1,2);default(0)"` |
| 96 | orm.Manager `json:"-"` | 96 | Created time.Time `orm:"auto_now_add"` |
| 97 | } | 97 | orm.Manager `json:"-"` |
| 98 | 98 | } | |
| 99 | func NewComment() *Comment { | 99 | |
| 100 | obj := new(Comment) | 100 | func NewComment() *Comment { |
| 101 | obj.Manager.Init(obj) | 101 | obj := new(Comment) |
| 102 | return obj | 102 | obj.Manager.Init(obj) |
| 103 | } | 103 | return obj |
| 104 | 104 | } | |
| 105 | func init() { | 105 | |
| 106 | // 需要在init中注册定义的model | 106 | func init() { |
| 107 | orm.RegisterModel(new(User)) | 107 | // 需要在init中注册定义的model |
| 108 | orm.RegisterModel(new(Profile)) | 108 | orm.RegisterModel(new(User)) |
| 109 | orm.RegisterModel(new(Post)) | 109 | orm.RegisterModel(new(Profile)) |
| 110 | orm.RegisterModel(new(Tag)) | 110 | orm.RegisterModel(new(Post)) |
| 111 | orm.RegisterModel(new(Comment)) | 111 | orm.RegisterModel(new(Tag)) |
| 112 | } | 112 | orm.RegisterModel(new(Comment)) |
| 113 | } | ||
| 114 | ``` | ||
| 113 | 115 | ||
| 114 | ## Field Type | 116 | ## Field Type |
| 115 | 117 | ||
| ... | @@ -140,8 +142,9 @@ note: 根据文档的更新,随时都可能更新这个 Model | ... | @@ -140,8 +142,9 @@ note: 根据文档的更新,随时都可能更新这个 Model |
| 140 | * RelReverseMany | 142 | * RelReverseMany |
| 141 | 143 | ||
| 142 | ## Field Options | 144 | ## Field Options |
| 143 | 145 | ```go | |
| 144 | `orm:"null;rel(fk)"` | 146 | orm:"null;rel(fk)" |
| 147 | ``` | ||
| 145 | 148 | ||
| 146 | 通常每个 Field 的 StructTag 里包含两种类型的设置,类似 null 的 bool 型设置,还有 类似 rel(fk) 的指定值设置,bool 型默认为 false,指定以后即表示为 true | 149 | 通常每个 Field 的 StructTag 里包含两种类型的设置,类似 null 的 bool 型设置,还有 类似 rel(fk) 的指定值设置,bool 型默认为 false,指定以后即表示为 true |
| 147 | 150 | ||
| ... | @@ -174,40 +177,40 @@ note: 根据文档的更新,随时都可能更新这个 Model | ... | @@ -174,40 +177,40 @@ note: 根据文档的更新,随时都可能更新这个 Model |
| 174 | #### column | 177 | #### column |
| 175 | 178 | ||
| 176 | 为字段设置 db 字段的名称 | 179 | 为字段设置 db 字段的名称 |
| 177 | 180 | ```go | |
| 178 | UserName `orm:"column(db_user_name)"` | 181 | UserName `orm:"column(db_user_name)"` |
| 179 | 182 | ``` | |
| 180 | #### default | 183 | #### default |
| 181 | 184 | ||
| 182 | 为字段设置默认值,类型必须符合 | 185 | 为字段设置默认值,类型必须符合 |
| 183 | 186 | ```go | |
| 184 | Status int `orm:"default(1)"` | 187 | Status int `orm:"default(1)"` |
| 185 | 188 | ``` | |
| 186 | #### choices | 189 | #### choices |
| 187 | 190 | ||
| 188 | 为字段设置一组可选的值,类型必须符合。其他值 clean 会返回错误 | 191 | 为字段设置一组可选的值,类型必须符合。其他值 clean 会返回错误 |
| 189 | 192 | ```go | |
| 190 | Status int `orm:"choices(1,2,3,4)"` | 193 | Status int `orm:"choices(1,2,3,4)"` |
| 191 | 194 | ``` | |
| 192 | #### size (string) | 195 | #### size (string) |
| 193 | 196 | ||
| 194 | string 类型字段设置 size 以后,db type 将使用 varchar | 197 | string 类型字段设置 size 以后,db type 将使用 varchar |
| 195 | 198 | ```go | |
| 196 | Title string `orm:"size(60)"` | 199 | Title string `orm:"size(60)"` |
| 197 | 200 | ``` | |
| 198 | #### digits / decimals | 201 | #### digits / decimals |
| 199 | 202 | ||
| 200 | 设置 float32, float64 类型的浮点精度 | 203 | 设置 float32, float64 类型的浮点精度 |
| 201 | 204 | ```go | |
| 202 | Money float64 `orm:"digits(12);decimals(4)"` | 205 | Money float64 `orm:"digits(12);decimals(4)"` |
| 203 | 206 | ``` | |
| 204 | 总长度 12 小数点后 4 位 eg: `99999999.9999` | 207 | 总长度 12 小数点后 4 位 eg: `99999999.9999` |
| 205 | 208 | ||
| 206 | #### auto_now / auto_now_add | 209 | #### auto_now / auto_now_add |
| 207 | 210 | ```go | |
| 208 | Created time.Time `auto_now_add` | 211 | Created time.Time `auto_now_add` |
| 209 | Updated time.Time `auto_now` | 212 | Updated time.Time `auto_now` |
| 210 | 213 | ``` | |
| 211 | * auto_now 每次 model 保存时都会对时间自动更新 | 214 | * auto_now 每次 model 保存时都会对时间自动更新 |
| 212 | * auto_now_add 第一次保存时才设置时间 | 215 | * auto_now_add 第一次保存时才设置时间 |
| 213 | 216 | ||
| ... | @@ -216,49 +219,49 @@ string 类型字段设置 size 以后,db type 将使用 varchar | ... | @@ -216,49 +219,49 @@ string 类型字段设置 size 以后,db type 将使用 varchar |
| 216 | #### type | 219 | #### type |
| 217 | 220 | ||
| 218 | 设置为 date, time.Time 字段的对应 db 类型使用 date | 221 | 设置为 date, time.Time 字段的对应 db 类型使用 date |
| 219 | 222 | ```go | |
| 220 | Created time.Time `orm:"auto_now_add;type(date)"` | 223 | Created time.Time `orm:"auto_now_add;type(date)"` |
| 221 | 224 | ``` | |
| 222 | ## Relation Field Options | 225 | ## Relation Field Options |
| 223 | 226 | ||
| 224 | #### rel / reverse | 227 | #### rel / reverse |
| 225 | 228 | ||
| 226 | RelOneToOne: | 229 | **RelOneToOne**: |
| 227 | 230 | ```go | |
| 228 | type User struct { | 231 | type User struct { |
| 229 | ... | 232 | ... |
| 230 | Profile *Profile `orm:"null;rel(one);on_delete(set_null)"` | 233 | Profile *Profile `orm:"null;rel(one);on_delete(set_null)"` |
| 231 | 234 | ``` | |
| 232 | 对应的反向关系 RelReverseOne: | 235 | 对应的反向关系 **RelReverseOne**: |
| 233 | 236 | ```go | |
| 234 | type Profile struct { | 237 | type Profile struct { |
| 235 | ... | 238 | ... |
| 236 | User *User `orm:"reverse(one)" json:"-"` | 239 | User *User `orm:"reverse(one)" json:"-"` |
| 237 | 240 | ``` | |
| 238 | RelForeignKey: | 241 | **RelForeignKey**: |
| 239 | 242 | ```go | |
| 240 | type Post struct { | 243 | type Post struct { |
| 241 | ... | 244 | ... |
| 242 | User*User `orm:"rel(fk)"` // RelForeignKey relation | 245 | User*User `orm:"rel(fk)"` // RelForeignKey relation |
| 243 | 246 | ``` | |
| 244 | 对应的反向关系 RelReverseMany: | 247 | 对应的反向关系 **RelReverseMany**: |
| 245 | 248 | ```go | |
| 246 | type User struct { | 249 | type User struct { |
| 247 | ... | 250 | ... |
| 248 | Posts []*Post `orm:"reverse(many)" json:"-"` // fk 的反向关系 | 251 | Posts []*Post `orm:"reverse(many)" json:"-"` // fk 的反向关系 |
| 249 | 252 | ``` | |
| 250 | RelManyToMany: | 253 | **RelManyToMany**: |
| 251 | 254 | ```go | |
| 252 | type Post struct { | 255 | type Post struct { |
| 253 | ... | 256 | ... |
| 254 | Tags []*Tag `orm:"rel(m2m)"` // ManyToMany relation | 257 | Tags []*Tag `orm:"rel(m2m)"` // ManyToMany relation |
| 255 | 258 | ``` | |
| 256 | 对应的反向关系 RelReverseMany: | 259 | 对应的反向关系 **RelReverseMany**: |
| 257 | 260 | ```go | |
| 258 | type Tag struct { | 261 | type Tag struct { |
| 259 | ... | 262 | ... |
| 260 | Posts []*Post `orm:"reverse(many)" json:"-"` | 263 | Posts []*Post `orm:"reverse(many)" json:"-"` |
| 261 | 264 | ``` | |
| 262 | #### rel_table / rel_through | 265 | #### rel_table / rel_through |
| 263 | 266 | ||
| 264 | 此设置针对 `orm:"rel(m2m)"` 的关系字段 | 267 | 此设置针对 `orm:"rel(m2m)"` 的关系字段 |
| ... | @@ -275,17 +278,19 @@ RelManyToMany: | ... | @@ -275,17 +278,19 @@ RelManyToMany: |
| 275 | 278 | ||
| 276 | 设置对应的 rel 关系删除时,如何处理关系字段。 | 279 | 设置对应的 rel 关系删除时,如何处理关系字段。 |
| 277 | 280 | ||
| 278 | cascade 级联删除(默认值) | 281 | ```go |
| 279 | set_null 设置为 NULL,需要设置 null = true | 282 | cascade 级联删除(默认值) |
| 280 | set_default 设置为默认值,需要设置 default 值 | 283 | set_null 设置为 NULL,需要设置 null = true |
| 281 | do_nothing 什么也不做,忽略 | 284 | set_default 设置为默认值,需要设置 default 值 |
| 285 | do_nothing 什么也不做,忽略 | ||
| 282 | 286 | ||
| 283 | type User struct { | 287 | type User struct { |
| 284 | ... | ||
| 285 | Profile *Profile `orm:"null;rel(one);on_delete(set_null)"` | ||
| 286 | ... | 288 | ... |
| 287 | type Profile struct { | ||
| 288 | ... | ||
| 289 | User *User `orm:"reverse(one)" json:"-"` | ||
| 290 | |||
| 291 | 删除 Profile 时将设置 User.Profile 的数据库字段为 NULL | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 289 | Profile *Profile `orm:"null;rel(one);on_delete(set_null)"` | ||
| 290 | ... | ||
| 291 | type Profile struct { | ||
| 292 | ... | ||
| 293 | User *User `orm:"reverse(one)" json:"-"` | ||
| 294 | |||
| 295 | // 删除 Profile 时将设置 User.Profile 的数据库字段为 NULL | ||
| 296 | ``` | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| 1 | ## Object | 1 | ## Object |
| 2 | 2 | ||
| 3 | 对 object 操作的三个方法 Insert / Update / Delete | 3 | 对 object 操作的三个方法 Insert / Update / Delete |
| 4 | 4 | ```go | |
| 5 | o := orm.NewOrm() | 5 | o := orm.NewOrm() |
| 6 | user := NewUser() | 6 | user := NewUser() |
| 7 | user.UserName = "slene" | 7 | user.UserName = "slene" |
| 8 | user.Password = "password" | 8 | user.Password = "password" |
| 9 | user.Email = "vslene@gmail.com" | 9 | user.Email = "vslene@gmail.com" |
| 10 | obj := o.Object(user) | 10 | obj := o.Object(user) |
| 11 | fmt.Println(obj.Insert()) | 11 | fmt.Println(obj.Insert()) |
| 12 | user.UserName = "Your" | 12 | user.UserName = "Your" |
| 13 | fmt.Println(obj.Update()) | 13 | fmt.Println(obj.Update()) |
| 14 | fmt.Println(obj.Delete()) | 14 | fmt.Println(obj.Delete()) |
| 15 | 15 | ``` | |
| 16 | ### Read | 16 | ### Read |
| 17 | 17 | ```go | |
| 18 | var user User | 18 | var user User |
| 19 | err := o.QueryTable("user").Filter("id", 1).One(&user) | 19 | err := o.QueryTable("user").Filter("id", 1).One(&user) |
| 20 | if err != orm.ErrMultiRows { | 20 | if err != orm.ErrMultiRows { |
| 21 | fmt.Println(user.UserName) | 21 | fmt.Println(user.UserName) |
| 22 | } | 22 | } |
| 23 | 23 | ``` | |
| 24 | ### Create | 24 | ### Create |
| 25 | 25 | ```go | |
| 26 | profile := NewProfile() | 26 | profile := NewProfile() |
| 27 | profile.Age = 30 | 27 | profile.Age = 30 |
| 28 | profile.Money = 9.8 | 28 | profile.Money = 9.8 |
| 29 | 29 | ||
| 30 | user := NewUser() | 30 | user := NewUser() |
| 31 | user.Profile = profile | 31 | user.Profile = profile |
| 32 | user.UserName = "slene" | 32 | user.UserName = "slene" |
| 33 | user.Password = "password" | 33 | user.Password = "password" |
| 34 | user.Email = "vslene@gmail.com" | 34 | user.Email = "vslene@gmail.com" |
| 35 | user.IsActive = true | 35 | user.IsActive = true |
| 36 | 36 | ||
| 37 | fmt.Println(o.Object(profile).Insert()) | 37 | fmt.Println(o.Object(profile).Insert()) |
| 38 | fmt.Println(o.Object(user).Insert()) | 38 | fmt.Println(o.Object(user).Insert()) |
| 39 | fmt.Println(user.Id) | 39 | fmt.Println(user.Id) |
| 40 | 40 | ``` | |
| 41 | 创建后会自动对 auto 的 field 赋值 | 41 | 创建后会自动对 auto 的 field 赋值 |
| 42 | 42 | ||
| 43 | ### Update | 43 | ### Update |
| 44 | 44 | ```go | |
| 45 | var user User | 45 | var user User |
| 46 | err := o.QueryTable("user").Filter("id", 1).One(&user) | 46 | err := o.QueryTable("user").Filter("id", 1).One(&user) |
| 47 | if err != orm.ErrMultiRows { | 47 | if err != orm.ErrMultiRows { |
| 48 | fmt.Println(user.UserName) | 48 | fmt.Println(user.UserName) |
| 49 | } | 49 | } |
| 50 | user.UserName = "MyName" | 50 | user.UserName = "MyName" |
| 51 | o.Object(&user).Update() | 51 | o.Object(&user).Update() |
| 52 | 52 | ``` | |
| 53 | ### Delete | 53 | ### Delete |
| 54 | 54 | ```go | |
| 55 | o.Object(user).Delete() | 55 | o.Object(user).Delete() |
| 56 | 56 | ``` | |
| 57 | Delete 操作会对反向关系进行操作,此例中 Post 拥有一个到 User 的外键。删除 User 的时候。如果 on_delete 设置为默认的级联操作,将删除对应的 Post | 57 | Delete 操作会对反向关系进行操作,此例中 Post 拥有一个到 User 的外键。删除 User 的时候。如果 on_delete 设置为默认的级联操作,将删除对应的 Post |
| 58 | 58 | ||
| 59 | 删除以后会清除 auto field 的值 | 59 | 删除以后会清除 auto field 的值 | ... | ... |
| 1 | ## Orm | 1 | ## Orm |
| 2 | 2 | ||
| 3 | beego/orm 的使用方法 | 3 | beego/orm 的使用方法 |
| 4 | ```go | ||
| 5 | package main | ||
| 4 | 6 | ||
| 5 | package main | 7 | import ( |
| 6 | 8 | "fmt" | |
| 7 | import ( | 9 | "github.com/astaxie/beego/orm" |
| 8 | "fmt" | 10 | _ "github.com/go-sql-driver/mysql" |
| 9 | "github.com/astaxie/beego/orm" | 11 | ) |
| 10 | _ "github.com/go-sql-driver/mysql" | 12 | |
| 11 | ) | 13 | func init() { |
| 12 | 14 | // 这个用来设置 driverName 对应的数据库类型 | |
| 13 | func init() { | 15 | // mysql / sqlite3 / postgres 这三种是默认已经注册过的,所以可以无需设置 |
| 14 | // 这个用来设置 driverName 对应的数据库类型 | 16 | orm.RegisterDriver("mysql", orm.DR_MySQL) |
| 15 | // mysql / sqlite3 / postgres 这三种是默认已经注册过的,所以可以无需设置 | 17 | |
| 16 | orm.RegisterDriver("mysql", orm.DR_MySQL) | 18 | // 参数1 自定义的数据库名称,用来在orm中切换数据库使用 |
| 17 | 19 | // 参数2 driverName | |
| 18 | // 参数1 自定义的数据库名称,用来在orm中切换数据库使用 | 20 | // 参数3 对应的链接字符串 |
| 19 | // 参数2 driverName | 21 | // 参数4 设置最大的空闲连接数,使用 golang 自己的连接池 |
| 20 | // 参数3 对应的链接字符串 | 22 | orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8", 30) |
| 21 | // 参数4 设置最大的空闲连接数,使用 golang 自己的连接池 | 23 | } |
| 22 | orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8", 30) | 24 | |
| 23 | } | 25 | func main() { |
| 24 | 26 | // 请确保在所有 RegisterModel 之前执行 | |
| 25 | func main() { | 27 | orm.BootStrap() // 强制在 main 函数里调用,检查 Model 关系,检测数据库参数,调用 orm 提供的 Command |
| 26 | orm.BootStrap() // 强制在 main 函数里调用,检查 Model 关系,检测数据库参数,调用 orm 提供的 Command | 28 | |
| 27 | 29 | o := orm.NewOrm() | |
| 28 | o := orm.NewOrm() | 30 | o.Using("default") // 默认使用 default,你可以指定为其他数据库 |
| 29 | o.Using("default") // 默认使用 default,你可以指定为其他数据库 | 31 | |
| 30 | 32 | profile := NewProfile() | |
| 31 | profile := NewProfile() | 33 | profile.Age = 30 |
| 32 | profile.Age = 30 | 34 | profile.Money = 9.8 |
| 33 | profile.Money = 9.8 | 35 | |
| 34 | 36 | user := NewUser() | |
| 35 | user := NewUser() | 37 | user.Profile = profile |
| 36 | user.Profile = profile | 38 | user.UserName = "slene" |
| 37 | user.UserName = "slene" | 39 | user.Password = "password" |
| 38 | user.Password = "password" | 40 | user.Email = "vslene@gmail.com" |
| 39 | user.Email = "vslene@gmail.com" | 41 | user.IsActive = true |
| 40 | user.IsActive = true | 42 | |
| 41 | 43 | fmt.Println(o.Object(profile).Insert()) | |
| 42 | fmt.Println(o.Object(profile).Insert()) | 44 | fmt.Println(o.Object(user).Insert()) |
| 43 | fmt.Println(o.Object(user).Insert()) | 45 | |
| 44 | 46 | var params []orm.Params | |
| 45 | var params []orm.Params | 47 | if cnt, err := o.QueryTable("user").RelatedSel().Limit(3).OrderBy("-id").Values(¶ms); err != nil { |
| 46 | if cnt, err := o.QueryTable("user").RelatedSel().Limit(3).OrderBy("-id").Values(¶ms); err != nil { | 48 | fmt.Println(err) |
| 47 | fmt.Println(err) | 49 | } else { |
| 48 | } else { | 50 | fmt.Println(cnt) |
| 49 | fmt.Println(cnt) | 51 | for _, p := range params { |
| 50 | for _, p := range params { | 52 | fmt.Println(p) |
| 51 | fmt.Println(p) | ||
| 52 | } | ||
| 53 | } | 53 | } |
| 54 | 54 | } | |
| 55 | var users []*User | 55 | |
| 56 | if cnt, err := o.QueryTable("user").RelatedSel().Limit(3).OrderBy("-id").All(&users); err != nil { | 56 | var users []*User |
| 57 | fmt.Println(err) | 57 | if cnt, err := o.QueryTable("user").RelatedSel().Limit(3).OrderBy("-id").All(&users); err != nil { |
| 58 | } else { | 58 | fmt.Println(err) |
| 59 | fmt.Println(cnt) | 59 | } else { |
| 60 | for _, u := range users { | 60 | fmt.Println(cnt) |
| 61 | fmt.Println(u.Id, u.Profile) | 61 | for _, u := range users { |
| 62 | } | 62 | fmt.Println(u.Id, u.Profile) |
| 63 | } | 63 | } |
| 64 | } | 64 | } |
| 65 | } | ||
| 66 | ``` | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -3,16 +3,16 @@ | ... | @@ -3,16 +3,16 @@ |
| 3 | orm 以 **QuerySeter** 来组织查询,每个返回 **QuerySeter** 的方法都会获得一个新的 **QuerySeter** 对象。 | 3 | orm 以 **QuerySeter** 来组织查询,每个返回 **QuerySeter** 的方法都会获得一个新的 **QuerySeter** 对象。 |
| 4 | 4 | ||
| 5 | 基本使用方法: | 5 | 基本使用方法: |
| 6 | ```go | ||
| 7 | o := orm.NewOrm() | ||
| 6 | 8 | ||
| 7 | o := orm.NewOrm() | 9 | // 获取 QuerySeter 对象,user 为表名 |
| 8 | 10 | qs := o.QueryTable("user") | |
| 9 | // 获取 QuerySeter 对象,user 为表名 | ||
| 10 | qs := o.QueryTable("user") | ||
| 11 | |||
| 12 | // 也可以直接使用对象作为表名 | ||
| 13 | user := NewUser() | ||
| 14 | qs = o.QueryTable(user) // 返回 QuerySeter | ||
| 15 | 11 | ||
| 12 | // 也可以直接使用对象作为表名 | ||
| 13 | user := NewUser() | ||
| 14 | qs = o.QueryTable(user) // 返回 QuerySeter | ||
| 15 | ``` | ||
| 16 | ### expr | 16 | ### expr |
| 17 | 17 | ||
| 18 | QuerySeter 中用于描述字段和 sql 操作符使用简单的 expr 查询方法 | 18 | QuerySeter 中用于描述字段和 sql 操作符使用简单的 expr 查询方法 |
| ... | @@ -20,18 +20,18 @@ QuerySeter ä¸ç”¨äºŽæè¿°å—段和 sql æ“作符使用简å•çš„ expr 查询方æ | ... | @@ -20,18 +20,18 @@ QuerySeter ä¸ç”¨äºŽæè¿°å—段和 sql æ“作符使用简å•çš„ expr 查询方æ |
| 20 | 字段组合的前后顺序依照表的关系,比如 User 表拥有 Profile 的外键,那么对 User 表查询对应的 Profile.Age 为条件,则使用 `Profile__Age` 注意,字段的分隔符号使用双下划线 `__`,除了描述字段, expr 的尾部可以增加操作符以执行对应的 sql 操作。比如 `Profile__Age__gt` 代表 Profile.Age > 18 的条件查询。 | 20 | 字段组合的前后顺序依照表的关系,比如 User 表拥有 Profile 的外键,那么对 User 表查询对应的 Profile.Age 为条件,则使用 `Profile__Age` 注意,字段的分隔符号使用双下划线 `__`,除了描述字段, expr 的尾部可以增加操作符以执行对应的 sql 操作。比如 `Profile__Age__gt` 代表 Profile.Age > 18 的条件查询。 |
| 21 | 21 | ||
| 22 | 注释后面将描述对应的 sql 语句,仅仅是描述 expr 的类似结果,并不代表实际生成的语句。 | 22 | 注释后面将描述对应的 sql 语句,仅仅是描述 expr 的类似结果,并不代表实际生成的语句。 |
| 23 | 23 | ```go | |
| 24 | qs.Filter("id", 1) // WHERE id = 1 | 24 | qs.Filter("id", 1) // WHERE id = 1 |
| 25 | qs.Filter("profile__age", 18) // WHERE profile.age = 18 | 25 | qs.Filter("profile__age", 18) // WHERE profile.age = 18 |
| 26 | qs.Filter("Profile__Age", 18) // 使用字段名和Field名都是允许的 | 26 | qs.Filter("Profile__Age", 18) // 使用字段名和Field名都是允许的 |
| 27 | qs.Filter("profile__age", 18) // WHERE profile.age = 18 | 27 | qs.Filter("profile__age", 18) // WHERE profile.age = 18 |
| 28 | qs.Filter("profile__age__gt", 18) // WHERE profile.age > 18 | 28 | qs.Filter("profile__age__gt", 18) // WHERE profile.age > 18 |
| 29 | qs.Filter("profile__age__gte", 18) // WHERE profile.age >= 18 | 29 | qs.Filter("profile__age__gte", 18) // WHERE profile.age >= 18 |
| 30 | qs.Filter("profile__age__in", 18, 20) // WHERE profile.age IN (18, 20) | 30 | qs.Filter("profile__age__in", 18, 20) // WHERE profile.age IN (18, 20) |
| 31 | 31 | ||
| 32 | qs.Filter("profile__age__in", 18, 20).Exclude("profile__money__lt", 1000) | 32 | qs.Filter("profile__age__in", 18, 20).Exclude("profile__money__lt", 1000) |
| 33 | // WHERE profile.age IN (18, 20) AND NOT profile.money < 1000 | 33 | // WHERE profile.age IN (18, 20) AND NOT profile.money < 1000 |
| 34 | 34 | ``` | |
| 35 | ### Operators | 35 | ### Operators |
| 36 | 36 | ||
| 37 | 当前支持的操作符号 | 37 | 当前支持的操作符号 |
| ... | @@ -39,162 +39,166 @@ QuerySeter ä¸ç”¨äºŽæè¿°å—段和 sql æ“作符使用简å•çš„ expr 查询方æ | ... | @@ -39,162 +39,166 @@ QuerySeter ä¸ç”¨äºŽæè¿°å—段和 sql æ“作符使用简å•çš„ expr 查询方æ |
| 39 | #### exact | 39 | #### exact |
| 40 | 40 | ||
| 41 | Filter / Exclude / Condition expr 的默认值 | 41 | Filter / Exclude / Condition expr 的默认值 |
| 42 | 42 | ```go | |
| 43 | qs.Filter("user_name", "slene") // WHERE user_name = 'slene' | 43 | qs.Filter("user_name", "slene") // WHERE user_name = 'slene' |
| 44 | qs.Filter("user_name__exact", "slene") // WHERE user_name = 'slene' | 44 | qs.Filter("user_name__exact", "slene") // WHERE user_name = 'slene' |
| 45 | qs.Filter("profile", nil) // WHERE profile_id IS NULL | 45 | // 使用 = 匹配,大小写是否敏感取决于数据表使用的 collation |
| 46 | 46 | qs.Filter("profile", nil) // WHERE profile_id IS NULL | |
| 47 | ``` | ||
| 47 | #### iexact | 48 | #### iexact |
| 48 | 49 | ```go | |
| 49 | qs.Filter("user_name__iexact", "slene") | 50 | qs.Filter("user_name__iexact", "slene") |
| 50 | // WHERE user_name LIKE 'slene' | 51 | // WHERE user_name LIKE 'slene' |
| 51 | // 大小写不敏感,匹配任意 'Slene' 'sLENE' | 52 | // 大小写不敏感,匹配任意 'Slene' 'sLENE' |
| 52 | 53 | ``` | |
| 53 | #### contains | 54 | #### contains |
| 54 | 55 | ```go | |
| 55 | qs.Filter("user_name__contains", "slene") | 56 | qs.Filter("user_name__contains", "slene") |
| 56 | // WHERE user_name LIKE BINARY '%slene%' | 57 | // WHERE user_name LIKE BINARY '%slene%' |
| 57 | // 大小写敏感, 匹配包含 slene 的字符 | 58 | // 大小写敏感, 匹配包含 slene 的字符 |
| 58 | 59 | ``` | |
| 59 | #### icontains | 60 | #### icontains |
| 60 | 61 | ```go | |
| 61 | qs.Filter("user_name__icontains", "slene") | 62 | qs.Filter("user_name__icontains", "slene") |
| 62 | // WHERE user_name LIKE '%slene%' | 63 | // WHERE user_name LIKE '%slene%' |
| 63 | // 大小写不敏感, 匹配任意 'im Slene', 'im sLENE' | 64 | // 大小写不敏感, 匹配任意 'im Slene', 'im sLENE' |
| 64 | 65 | ``` | |
| 65 | #### in | 66 | #### in |
| 66 | 67 | ```go | |
| 67 | qs.Filter("profile__age__in", 17, 18, 19, 20) | 68 | qs.Filter("profile__age__in", 17, 18, 19, 20) |
| 68 | // WHERE profile.age IN (17, 18, 19, 20) | 69 | // WHERE profile.age IN (17, 18, 19, 20) |
| 69 | 70 | ``` | |
| 70 | #### gt / gte | 71 | #### gt / gte |
| 72 | ```go | ||
| 73 | qs.Filter("profile__age__gt", 17) | ||
| 74 | // WHERE profile.age > 17 | ||
| 71 | 75 | ||
| 72 | qs.Filter("profile__age__gt", 17) | 76 | qs.Filter("profile__age__gte", 18) |
| 73 | // WHERE profile.age > 17 | 77 | // WHERE profile.age >= 18 |
| 74 | 78 | ``` | |
| 75 | qs.Filter("profile__age__gte", 18) | ||
| 76 | // WHERE profile.age >= 18 | ||
| 77 | |||
| 78 | #### lt / lte | 79 | #### lt / lte |
| 80 | ```go | ||
| 81 | qs.Filter("profile__age__lt", 17) | ||
| 82 | // WHERE profile.age < 17 | ||
| 79 | 83 | ||
| 80 | qs.Filter("profile__age__lt", 17) | 84 | qs.Filter("profile__age__lte", 18) |
| 81 | // WHERE profile.age < 17 | 85 | // WHERE profile.age <= 18 |
| 82 | 86 | ``` | |
| 83 | qs.Filter("profile__age__lte", 18) | ||
| 84 | // WHERE profile.age <= 18 | ||
| 85 | |||
| 86 | #### startswith | 87 | #### startswith |
| 87 | 88 | ```go | |
| 88 | qs.Filter("user_name__startswith", "slene") | 89 | qs.Filter("user_name__startswith", "slene") |
| 89 | // WHERE user_name LIKE BINARY 'slene%' | 90 | // WHERE user_name LIKE BINARY 'slene%' |
| 90 | // 大小写敏感, 匹配以 'slene' 起始的字符串 | 91 | // 大小写敏感, 匹配以 'slene' 起始的字符串 |
| 91 | 92 | ``` | |
| 92 | #### istartswith | 93 | #### istartswith |
| 93 | 94 | ```go | |
| 94 | qs.Filter("user_name__istartswith", "slene") | 95 | qs.Filter("user_name__istartswith", "slene") |
| 95 | // WHERE user_name LIKE 'slene%' | 96 | // WHERE user_name LIKE 'slene%' |
| 96 | // 大小写不敏感, 匹配任意以 'slene', 'Slene' 起始的字符串 | 97 | // 大小写不敏感, 匹配任意以 'slene', 'Slene' 起始的字符串 |
| 97 | 98 | ``` | |
| 98 | |||
| 99 | #### endswith | 99 | #### endswith |
| 100 | 100 | ```go | |
| 101 | qs.Filter("user_name__endswith", "slene") | 101 | qs.Filter("user_name__endswith", "slene") |
| 102 | // WHERE user_name LIKE BINARY '%slene' | 102 | // WHERE user_name LIKE BINARY '%slene' |
| 103 | // 大小写敏感, 匹配以 'slene' 结束的字符串 | 103 | // 大小写敏感, 匹配以 'slene' 结束的字符串 |
| 104 | 104 | ``` | |
| 105 | #### iendswith | 105 | #### iendswith |
| 106 | 106 | ```go | |
| 107 | qs.Filter("user_name__startswith", "slene") | 107 | qs.Filter("user_name__startswith", "slene") |
| 108 | // WHERE user_name LIKE '%slene' | 108 | // WHERE user_name LIKE '%slene' |
| 109 | // 大小写不敏感, 匹配任意以 'slene', 'Slene' 结束的字符串 | 109 | // 大小写不敏感, 匹配任意以 'slene', 'Slene' 结束的字符串 |
| 110 | 110 | ``` | |
| 111 | #### isnull | 111 | #### isnull |
| 112 | 112 | ```go | |
| 113 | qs.Filter("profile__isnull", true) | 113 | qs.Filter("profile__isnull", true) |
| 114 | qs.Filter("profile_id__isnull", true) | 114 | qs.Filter("profile_id__isnull", true) |
| 115 | // WHERE profile_id IS NULL | 115 | // WHERE profile_id IS NULL |
| 116 | 116 | ||
| 117 | qs.Filter("profile__isnull", false) | 117 | qs.Filter("profile__isnull", false) |
| 118 | // WHERE profile_id IS NOT NULL | 118 | // WHERE profile_id IS NOT NULL |
| 119 | 119 | ``` | |
| 120 | ## QuerySeter | 120 | ## QuerySeter |
| 121 | 121 | ||
| 122 | #### Filter | 122 | #### Filter |
| 123 | 123 | ||
| 124 | 多个 Filter 之间使用 `AND` 连接 | 124 | 多个 Filter 之间使用 `AND` 连接 |
| 125 | 125 | ```go | |
| 126 | qs.Filter("profile__isnull", true).Filter("user_name", "slene") | 126 | qs.Filter("profile__isnull", true).Filter("user_name", "slene") |
| 127 | // WHERE profile_id IS NULL AND user_name = 'slene' | 127 | // WHERE profile_id IS NULL AND user_name = 'slene' |
| 128 | 128 | ``` | |
| 129 | #### Exclude | 129 | #### Exclude |
| 130 | 130 | ||
| 131 | 使用 `NOT` 排除条件 | 131 | 使用 `NOT` 排除条件 |
| 132 | 132 | ||
| 133 | 多个 Exclude 之间使用 `AND` 连接 | 133 | 多个 Exclude 之间使用 `AND` 连接 |
| 134 | 134 | ```go | |
| 135 | qs.Exclude("profile__isnull", true).Filter("user_name", "slene") | 135 | qs.Exclude("profile__isnull", true).Filter("user_name", "slene") |
| 136 | // WHERE NOT profile_id IS NULL AND user_name = 'slene' | 136 | // WHERE NOT profile_id IS NULL AND user_name = 'slene' |
| 137 | 137 | ``` | |
| 138 | #### Limit | 138 | #### Limit |
| 139 | 139 | ||
| 140 | 限制最大返回数据行数,第二个参数可以设置 `Offset` | 140 | 限制最大返回数据行数,第二个参数可以设置 `Offset` |
| 141 | ```go | ||
| 142 | var DefaultRowsLimit = 1000 // orm 默认的 limit 值为 1000 | ||
| 141 | 143 | ||
| 142 | var DefaultRowsLimit = 1000 // orm 默认的 limit 值为 1000 | 144 | // 默认情况下 select 查询的最大行数为 1000 |
| 143 | 145 | // LIMIT 1000 | |
| 144 | // 默认情况下 select 查询的最大行数为 1000 | 146 | |
| 145 | // LIMIT 1000 | 147 | qs.Limit(10) |
| 146 | 148 | // LIMIT 10 | |
| 147 | qs.Limit(10) | ||
| 148 | // LIMIT 10 | ||
| 149 | |||
| 150 | qs.Limit(10, 20) | ||
| 151 | // LIMIT 10 OFFSET 20 | ||
| 152 | |||
| 153 | qs.Limit(-1) | ||
| 154 | // no limit | ||
| 155 | |||
| 156 | qs.Limit(-1, 100) | ||
| 157 | // LIMIT 18446744073709551615 OFFSET 100 | ||
| 158 | // 18446744073709551615 是 1<<64 - 1 用来指定无 limit 限制 但有 offset 偏移的情况 | ||
| 159 | 149 | ||
| 150 | qs.Limit(10, 20) | ||
| 151 | // LIMIT 10 OFFSET 20 | ||
| 152 | |||
| 153 | qs.Limit(-1) | ||
| 154 | // no limit | ||
| 155 | |||
| 156 | qs.Limit(-1, 100) | ||
| 157 | // LIMIT 18446744073709551615 OFFSET 100 | ||
| 158 | // 18446744073709551615 是 1<<64 - 1 用来指定无 limit 限制 但有 offset 偏移的情况 | ||
| 159 | ``` | ||
| 160 | #### Offset | 160 | #### Offset |
| 161 | 161 | ||
| 162 | 设置 偏移行数 | 162 | 设置 偏移行数 |
| 163 | 163 | ```go | |
| 164 | qs.OFFSET(20) | 164 | qs.OFFSET(20) |
| 165 | // LIMIT 1000 OFFSET 20 | 165 | // LIMIT 1000 OFFSET 20 |
| 166 | 166 | ``` | |
| 167 | #### OrderBy | 167 | #### OrderBy |
| 168 | 168 | ||
| 169 | 参数使用 **expr** | 169 | 参数使用 **expr** |
| 170 | 170 | ||
| 171 | 在 expr 前使用减号 `-` 表示 `DESC` 的排列 | 171 | 在 expr 前使用减号 `-` 表示 `DESC` 的排列 |
| 172 | ```go | ||
| 173 | qs.OrderBy("id", "-profile__age") | ||
| 174 | // ORDER BY id ASC, profile.age DESC | ||
| 172 | 175 | ||
| 173 | qs.OrderBy("id", "-profile__age") | 176 | qs.OrderBy("-profile__money", "profile") |
| 174 | // ORDER BY id ASC, profile.age DESC | 177 | // ORDER BY profile.money DESC, profile_id ASC |
| 175 | 178 | ``` | |
| 176 | qs.OrderBy("-profile__money", "profile") | ||
| 177 | // ORDER BY profile.money DESC, profile_id ASC | ||
| 178 | |||
| 179 | #### RelatedSel | 179 | #### RelatedSel |
| 180 | 180 | ||
| 181 | 关系查询,参数使用 **expr** | 181 | 关系查询,参数使用 **expr** |
| 182 | ```go | ||
| 183 | var DefaultRelsDepth = 5 // 默认情况下直接调用 RelatedSel 将进行最大 5 层的关系查询 | ||
| 182 | 184 | ||
| 183 | var DefaultRelsDepth = 5 // 默认情况下直接调用 RelatedSel 将进行最大 5 层的关系查询 | 185 | qs := o.QueryTable("post") |
| 184 | 186 | ||
| 185 | qs := o.QueryTable("post") | 187 | qs.RelateSel() |
| 186 | 188 | // INNER JOIN user ... LEFT OUTER JOIN profile ... | |
| 187 | qs.RelateSel() | ||
| 188 | // INNER JOIN user ... LEFT OUTER JOIN profile ... | ||
| 189 | |||
| 190 | qs.RelateSel("user") | ||
| 191 | // INNER JOIN user ... | ||
| 192 | // 设置 expr 只对设置的字段进行关系查询 | ||
| 193 | |||
| 194 | // 对设置 null 属性的 Field 将使用 LEFT OUTER JOIN | ||
| 195 | 189 | ||
| 190 | qs.RelateSel("user") | ||
| 191 | // INNER JOIN user ... | ||
| 192 | // 设置 expr 只对设置的字段进行关系查询 | ||
| 196 | 193 | ||
| 194 | // 对设置 null 属性的 Field 将使用 LEFT OUTER JOIN | ||
| 195 | ``` | ||
| 196 | #### Count | ||
| 197 | 197 | ||
| 198 | 查询当前条件下的行数 | ||
| 199 | ```go | ||
| 200 | o.QueryTable("user").Count() // SELECT COUNT(*) FROM USER | ||
| 201 | ``` | ||
| 198 | 202 | ||
| 199 | 203 | ||
| 200 | 204 | ... | ... |
| 1 | ## beego orm 介绍 | 1 | ## beego orm 介绍 |
| 2 | 2 | ||
| 3 | ## 快速入门 | ||
| 3 | 4 | ||
| 4 | ## 指南 | 5 | ```go |
| 6 | package main | ||
| 7 | |||
| 8 | import ( | ||
| 9 | "fmt" | ||
| 10 | "github.com/astaxie/beego/orm" | ||
| 11 | _ "github.com/go-sql-driver/mysql" | ||
| 12 | ) | ||
| 13 | |||
| 14 | // 最简单的两个表的定义 | ||
| 15 | type User struct { | ||
| 16 | Id int `orm:"auto"` | ||
| 17 | Name string `orm:"size(100)"` | ||
| 18 | orm.Manager | ||
| 19 | } | ||
| 20 | |||
| 21 | type Post struct { | ||
| 22 | Id int `orm:"auto"` | ||
| 23 | User *User `orm:"rel(fk)"` | ||
| 24 | Title string `orm:"size(100)"` | ||
| 25 | Content string | ||
| 26 | orm.Manager | ||
| 27 | } | ||
| 28 | |||
| 29 | func init() { | ||
| 30 | // 将表定义注册到 orm 里 | ||
| 31 | orm.RegisterModel(new(User)) | ||
| 32 | orm.RegisterModel(new(Post)) | ||
| 33 | |||
| 34 | // 链接参数设置 | ||
| 35 | orm.RegisterDataBase("default", "mysql", "root:root@/my_db?charset=utf8", 30) | ||
| 36 | } | ||
| 37 | |||
| 38 | func main() { | ||
| 39 | orm.BootStrap() // 确保在所有 RegisterModel 之后执行 | ||
| 40 | |||
| 41 | o := orm.NewOrm() | ||
| 42 | |||
| 43 | var user User | ||
| 44 | obj := o.Object(&user) | ||
| 45 | |||
| 46 | // 创建 | ||
| 47 | user.Name = "slene" | ||
| 48 | id, err := obj.Insert() | ||
| 49 | fmt.Println(id, err) | ||
| 50 | |||
| 51 | // 更新 | ||
| 52 | user.Name = "astaxie" | ||
| 53 | num, err := obj.Update() | ||
| 54 | fmt.Println(num, err) | ||
| 55 | |||
| 56 | // 查询单个 | ||
| 57 | var u User | ||
| 58 | err = o.QueryTable("user").Filter("id", &user).One(&u) | ||
| 59 | fmt.Println(u.Id, u.Name, err) | ||
| 60 | |||
| 61 | // 创建 post | ||
| 62 | var post Post | ||
| 63 | post.Title = "beego orm" | ||
| 64 | post.Content = "powerful amazing" | ||
| 65 | post.User = &u | ||
| 66 | id, err = o.Object(&post).Insert() | ||
| 67 | fmt.Println(id, err) | ||
| 68 | |||
| 69 | // 当然,以 map[string]interface{} 形式的数据返回也是允许的 | ||
| 70 | var maps []orm.Params | ||
| 71 | num, err = o.QueryTable("user").Filter("id", &u).Values(&maps) | ||
| 72 | fmt.Println(num, err, maps[0]) | ||
| 73 | |||
| 74 | // 删除 | ||
| 75 | num, err = obj.Delete() // 默认,级联删除 user 以及关系存在的 post | ||
| 76 | fmt.Println(num, err) | ||
| 77 | } | ||
| 78 | ``` | ||
| 79 | |||
| 80 | ## 详细文档 | ||
| 5 | 81 | ||
| 6 | 1. [Model Definition](Models.md) | 82 | 1. [Model Definition](Models.md) |
| 7 | 2. Custom Fields | 83 | 2. Custom Fields |
| ... | @@ -12,4 +88,3 @@ | ... | @@ -12,4 +88,3 @@ |
| 12 | 7. Raw | 88 | 7. Raw |
| 13 | 8. Transaction | 89 | 8. Transaction |
| 14 | 9. Faq | 90 | 9. Faq |
| 15 | ... | ... |
-
Please register or sign in to post a comment