zh docs update
Showing
5 changed files
with
169 additions
and
65 deletions
| ... | @@ -278,12 +278,12 @@ type Tag struct { | ... | @@ -278,12 +278,12 @@ type Tag struct { |
| 278 | 278 | ||
| 279 | 设置对应的 rel 关系删除时,如何处理关系字段。 | 279 | 设置对应的 rel 关系删除时,如何处理关系字段。 |
| 280 | 280 | ||
| 281 | ```go | 281 | cascade 级联删除(默认值) |
| 282 | cascade 级联删除(默认值) | 282 | set_null 设置为 NULL,需要设置 null = true |
| 283 | set_null 设置为 NULL,需要设置 null = true | 283 | set_default 设置为默认值,需要设置 default 值 |
| 284 | set_default 设置为默认值,需要设置 default 值 | 284 | do_nothing 什么也不做,忽略 |
| 285 | do_nothing 什么也不做,忽略 | ||
| 286 | 285 | ||
| 286 | ```go | ||
| 287 | type User struct { | 287 | type User struct { |
| 288 | ... | 288 | ... |
| 289 | Profile *Profile `orm:"null;rel(one);on_delete(set_null)"` | 289 | Profile *Profile `orm:"null;rel(one);on_delete(set_null)"` | ... | ... |
| 1 | ## Object | 1 | ## Object |
| 2 | 2 | ||
| 3 | 对 object 操作的三个方法 Insert / Update / Delete | 3 | 对 object 操作简单的三个方法 Read / Insert / Update / Delete |
| 4 | ```go | 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 | |
| 11 | fmt.Println(obj.Insert()) | 11 | fmt.Println(o.Insert(user)) |
| 12 | |||
| 12 | user.UserName = "Your" | 13 | user.UserName = "Your" |
| 13 | fmt.Println(obj.Update()) | 14 | fmt.Println(o.Update(user)) |
| 14 | fmt.Println(obj.Delete()) | 15 | |
| 16 | fmt.Println(o.Delete(user)) | ||
| 15 | ``` | 17 | ``` |
| 16 | ### Read | 18 | ### Read |
| 17 | ```go | 19 | ```go |
| 18 | var user User | 20 | o := orm.NewOrm() |
| 19 | err := o.QueryTable("user").Filter("id", 1).One(&user) | 21 | user := User{Id: 1} |
| 20 | if err != orm.ErrMultiRows { | 22 | |
| 21 | fmt.Println(user.UserName) | 23 | o.Read(&user) |
| 24 | |||
| 25 | if err == sql.ErrNoRows { | ||
| 26 | fmt.Println("查询不到") | ||
| 27 | } else if err == orm.ErrMissPK { | ||
| 28 | fmt.Println("找不到主键") | ||
| 29 | } else { | ||
| 30 | fmt.Println(user.Id, user.UserName) | ||
| 22 | } | 31 | } |
| 23 | ``` | 32 | ``` |
| 24 | ### Create | 33 | ### Insert |
| 25 | ```go | 34 | ```go |
| 26 | profile := NewProfile() | 35 | o := orm.NewOrm() |
| 27 | profile.Age = 30 | 36 | var user User |
| 28 | profile.Money = 9.8 | ||
| 29 | |||
| 30 | user := NewUser() | ||
| 31 | user.Profile = profile | ||
| 32 | user.UserName = "slene" | 37 | user.UserName = "slene" |
| 33 | user.Password = "password" | 38 | user.Password = "password" |
| 34 | user.Email = "vslene@gmail.com" | 39 | user.Email = "vslene@gmail.com" |
| 35 | user.IsActive = true | 40 | user.IsActive = true |
| 36 | 41 | ||
| 37 | fmt.Println(o.Object(profile).Insert()) | 42 | fmt.Println(o.Insert(&user)) |
| 38 | fmt.Println(o.Object(user).Insert()) | ||
| 39 | fmt.Println(user.Id) | 43 | fmt.Println(user.Id) |
| 40 | ``` | 44 | ``` |
| 41 | 创建后会自动对 auto 的 field 赋值 | 45 | 创建后会自动对 auto 的 field 赋值 |
| 42 | 46 | ||
| 43 | ### Update | 47 | ### Update |
| 44 | ```go | 48 | ```go |
| 45 | var user User | 49 | o := orm.NewOrm() |
| 46 | err := o.QueryTable("user").Filter("id", 1).One(&user) | 50 | user := User{Id: 1} |
| 47 | if err != orm.ErrMultiRows { | 51 | if o.Read(&user) == nil { |
| 48 | fmt.Println(user.UserName) | 52 | user.UserName = "MyName" |
| 53 | o.Update(&user) | ||
| 49 | } | 54 | } |
| 50 | user.UserName = "MyName" | ||
| 51 | o.Object(&user).Update() | ||
| 52 | ``` | 55 | ``` |
| 53 | ### Delete | 56 | ### Delete |
| 54 | ```go | 57 | ```go |
| 55 | o.Object(user).Delete() | 58 | o := orm.NewOrm() |
| 59 | o.Delete(&User{Id: 1}) | ||
| 56 | ``` | 60 | ``` |
| 57 | Delete 操作会对反向关系进行操作,此例中 Post 拥有一个到 User 的外键。删除 User 的时候。如果 on_delete 设置为默认的级联操作,将删除对应的 Post | 61 | Delete 操作会对反向关系进行操作,此例中 Post 拥有一个到 User 的外键。删除 User 的时候。如果 on_delete 设置为默认的级联操作,将删除对应的 Post |
| 58 | 62 | ... | ... |
| ... | @@ -40,8 +40,8 @@ func main() { | ... | @@ -40,8 +40,8 @@ func main() { |
| 40 | user.Email = "vslene@gmail.com" | 40 | user.Email = "vslene@gmail.com" |
| 41 | user.IsActive = true | 41 | user.IsActive = true |
| 42 | 42 | ||
| 43 | fmt.Println(o.Object(profile).Insert()) | 43 | fmt.Println(o.Insert(profile)) |
| 44 | fmt.Println(o.Object(user).Insert()) | 44 | fmt.Println(o.Insert(user)) |
| 45 | 45 | ||
| 46 | var params []orm.Params | 46 | var params []orm.Params |
| 47 | if cnt, err := o.QueryTable("user").RelatedSel().Limit(3).OrderBy("-id").Values(¶ms); err != nil { | 47 | if cnt, err := o.QueryTable("user").RelatedSel().Limit(3).OrderBy("-id").Values(¶ms); err != nil { | ... | ... |
| ... | @@ -126,6 +126,7 @@ qs.Filter("profile__isnull", false) | ... | @@ -126,6 +126,7 @@ qs.Filter("profile__isnull", false) |
| 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 | |||
| 129 | #### Exclude | 130 | #### Exclude |
| 130 | 131 | ||
| 131 | 使用 `NOT` 排除条件 | 132 | 使用 `NOT` 排除条件 |
| ... | @@ -135,6 +136,9 @@ qs.Filter("profile__isnull", true).Filter("user_name", "slene") | ... | @@ -135,6 +136,9 @@ qs.Filter("profile__isnull", true).Filter("user_name", "slene") |
| 135 | qs.Exclude("profile__isnull", true).Filter("user_name", "slene") | 136 | qs.Exclude("profile__isnull", true).Filter("user_name", "slene") |
| 136 | // WHERE NOT profile_id IS NULL AND user_name = 'slene' | 137 | // WHERE NOT profile_id IS NULL AND user_name = 'slene' |
| 137 | ``` | 138 | ``` |
| 139 | |||
| 140 | #### SetCond | ||
| 141 | |||
| 138 | #### Limit | 142 | #### Limit |
| 139 | 143 | ||
| 140 | 限制最大返回数据行数,第二个参数可以设置 `Offset` | 144 | 限制最大返回数据行数,第二个参数可以设置 `Offset` |
| ... | @@ -157,6 +161,7 @@ qs.Limit(-1, 100) | ... | @@ -157,6 +161,7 @@ qs.Limit(-1, 100) |
| 157 | // LIMIT 18446744073709551615 OFFSET 100 | 161 | // LIMIT 18446744073709551615 OFFSET 100 |
| 158 | // 18446744073709551615 是 1<<64 - 1 用来指定无 limit 限制 但有 offset 偏移的情况 | 162 | // 18446744073709551615 是 1<<64 - 1 用来指定无 limit 限制 但有 offset 偏移的情况 |
| 159 | ``` | 163 | ``` |
| 164 | |||
| 160 | #### Offset | 165 | #### Offset |
| 161 | 166 | ||
| 162 | 设置 偏移行数 | 167 | 设置 偏移行数 |
| ... | @@ -164,6 +169,7 @@ qs.Limit(-1, 100) | ... | @@ -164,6 +169,7 @@ qs.Limit(-1, 100) |
| 164 | qs.OFFSET(20) | 169 | qs.OFFSET(20) |
| 165 | // LIMIT 1000 OFFSET 20 | 170 | // LIMIT 1000 OFFSET 20 |
| 166 | ``` | 171 | ``` |
| 172 | |||
| 167 | #### OrderBy | 173 | #### OrderBy |
| 168 | 174 | ||
| 169 | 参数使用 **expr** | 175 | 参数使用 **expr** |
| ... | @@ -176,6 +182,7 @@ qs.OrderBy("id", "-profile__age") | ... | @@ -176,6 +182,7 @@ qs.OrderBy("id", "-profile__age") |
| 176 | qs.OrderBy("-profile__money", "profile") | 182 | qs.OrderBy("-profile__money", "profile") |
| 177 | // ORDER BY profile.money DESC, profile_id ASC | 183 | // ORDER BY profile.money DESC, profile_id ASC |
| 178 | ``` | 184 | ``` |
| 185 | |||
| 179 | #### RelatedSel | 186 | #### RelatedSel |
| 180 | 187 | ||
| 181 | 关系查询,参数使用 **expr** | 188 | 关系查询,参数使用 **expr** |
| ... | @@ -193,15 +200,132 @@ qs.RelateSel("user") | ... | @@ -193,15 +200,132 @@ qs.RelateSel("user") |
| 193 | 200 | ||
| 194 | // 对设置 null 属性的 Field 将使用 LEFT OUTER JOIN | 201 | // 对设置 null 属性的 Field 将使用 LEFT OUTER JOIN |
| 195 | ``` | 202 | ``` |
| 203 | |||
| 196 | #### Count | 204 | #### Count |
| 205 | 依据当前的查询条件,返回结果行数 | ||
| 206 | ```go | ||
| 207 | cnt, err := o.QueryTable("user").Count() // SELECT COUNT(*) FROM USER | ||
| 208 | fmt.Printf("Count Num: %s, %s", cnt, err) | ||
| 209 | ``` | ||
| 210 | |||
| 211 | #### Update | ||
| 212 | 依据当前查询条件,进行批量更新操作 | ||
| 213 | ```go | ||
| 214 | num, err := o.QueryTable("user").Filter("user_name", "slene").Update(orm.Params{ | ||
| 215 | "user_name": "astaxie", | ||
| 216 | }) | ||
| 217 | fmt.Printf("Affected Num: %s, %s", num, err) | ||
| 218 | // SET user_name = "astaixe" WHERE user_name = "slene" | ||
| 219 | ``` | ||
| 220 | |||
| 221 | #### Delete | ||
| 222 | 依据当前查询条件,进行批量删除操作 | ||
| 223 | ```go | ||
| 224 | num, err := o.QueryTable("user").Filter("user_name", "slene").Delete() | ||
| 225 | fmt.Printf("Affected Num: %s, %s", num, err) | ||
| 226 | // DELETE FROM user WHERE user_name = "slene" | ||
| 227 | ``` | ||
| 228 | |||
| 229 | #### All | ||
| 230 | 返回对应的结果集对象 | ||
| 231 | ```go | ||
| 232 | var users []*User | ||
| 233 | num, err := o.QueryTable("user").Filter("user_name", "slene").All(&users) | ||
| 234 | fmt.Printf("Returned Rows Num: %s, %s", num, err) | ||
| 235 | ``` | ||
| 236 | |||
| 237 | #### One | ||
| 238 | 尝试返回单个对象 | ||
| 239 | ```go | ||
| 240 | var user *User | ||
| 241 | err := o.QueryTable("user").Filter("user_name", "slene").One(&user) | ||
| 242 | if err == orm.ErrMultiRows { | ||
| 243 | fmt.Printf("Returned Multi Rows Not One") | ||
| 244 | } | ||
| 245 | ``` | ||
| 246 | |||
| 247 | #### Values | ||
| 248 | 返回结果集的 key => value 值 | ||
| 249 | |||
| 250 | key 为 Model 里的 Field name,value 的值 以 string 保存 | ||
| 251 | |||
| 252 | ```go | ||
| 253 | var maps []orm.Params | ||
| 254 | num, err := o.QueryTable("user").Values(&maps) | ||
| 255 | if err != nil { | ||
| 256 | fmt.Printf("Result Nums: %d\n", num) | ||
| 257 | for _, m := range maps { | ||
| 258 | fmt.Println(m["Id"], m["UserName"]) | ||
| 259 | } | ||
| 260 | } | ||
| 261 | ``` | ||
| 262 | |||
| 263 | 返回指定的 Field 数据 | ||
| 264 | |||
| 265 | **TODO**: 暂不支持级联查询 **RelatedSel** 直接返回 Values | ||
| 266 | |||
| 267 | 但可以直接指定 expr 级联返回需要的数据 | ||
| 268 | |||
| 269 | ```go | ||
| 270 | var maps []orm.Params | ||
| 271 | num, err := o.QueryTable("user").Values(&maps, "id", "user_name", "profile", "profile__age") | ||
| 272 | if err != nil { | ||
| 273 | fmt.Printf("Result Nums: %d\n", num) | ||
| 274 | for _, m := range maps { | ||
| 275 | fmt.Println(m["Id"], m["UserName"], m["Profile"], m["Profile__Age"]) | ||
| 276 | // map 中的数据都是展开的,没有复杂的嵌套 | ||
| 277 | } | ||
| 278 | } | ||
| 279 | ``` | ||
| 280 | |||
| 281 | #### ValuesList | ||
| 282 | |||
| 283 | 顾名思义,返回的结果集以slice存储 | ||
| 284 | |||
| 285 | 结果的排列与 Model 中定义的 Field 顺序一致 | ||
| 286 | |||
| 287 | 返回的每个元素值以 string 保存 | ||
| 197 | 288 | ||
| 198 | 查询当前条件下的行数 | ||
| 199 | ```go | 289 | ```go |
| 200 | o.QueryTable("user").Count() // SELECT COUNT(*) FROM USER | 290 | var lists []orm.ParamsList |
| 291 | num, err := o.QueryTable("user").ValuesList(&lists) | ||
| 292 | if err != nil { | ||
| 293 | fmt.Printf("Result Nums: %d\n", num) | ||
| 294 | for _, row := range lists { | ||
| 295 | fmt.Println(row) | ||
| 296 | } | ||
| 297 | } | ||
| 201 | ``` | 298 | ``` |
| 202 | 299 | ||
| 300 | 当然也可以指定 expr 返回指定的 Field | ||
| 301 | |||
| 302 | ```go | ||
| 303 | var lists []orm.ParamsList | ||
| 304 | num, err := o.QueryTable("user").ValuesList(&lists, "user_name", "profile__age") | ||
| 305 | if err != nil { | ||
| 306 | fmt.Printf("Result Nums: %d\n", num) | ||
| 307 | for _, row := range lists { | ||
| 308 | fmt.Printf("UserName: %s, Age: %s\m", row[0], row[1]) | ||
| 309 | } | ||
| 310 | } | ||
| 311 | ``` | ||
| 312 | |||
| 313 | #### ValuesFlat | ||
| 314 | |||
| 315 | 只返回特定的 Field 值,讲结果集展开到单个 slice 里 | ||
| 316 | |||
| 317 | ```go | ||
| 318 | var list orm.ParamsList | ||
| 319 | num, err := o.QueryTable("user").ValuesFlat(&list, "user_name") | ||
| 320 | if err != nil { | ||
| 321 | fmt.Printf("Result Nums: %d\n", num) | ||
| 322 | fmt.Printf("All User Names: %s", strings.Join(list, ", ") | ||
| 323 | } | ||
| 324 | ``` | ||
| 203 | 325 | ||
| 326 | #### PrepareInsert | ||
| 204 | 327 | ||
| 328 | 用于批量插入 prepare -> insert -> insert | ||
| 205 | 329 | ||
| 206 | 330 | ||
| 207 | 331 | ... | ... |
| ... | @@ -18,18 +18,9 @@ type User struct { | ... | @@ -18,18 +18,9 @@ type User struct { |
| 18 | orm.Manager | 18 | orm.Manager |
| 19 | } | 19 | } |
| 20 | 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() { | 21 | func init() { |
| 30 | // 将表定义注册到 orm 里 | 22 | // 将表定义注册到 orm 里 |
| 31 | orm.RegisterModel(new(User)) | 23 | orm.RegisterModel(new(User)) |
| 32 | orm.RegisterModel(new(Post)) | ||
| 33 | 24 | ||
| 34 | // 链接参数设置 | 25 | // 链接参数设置 |
| 35 | orm.RegisterDataBase("default", "mysql", "root:root@/my_db?charset=utf8", 30) | 26 | orm.RegisterDataBase("default", "mysql", "root:root@/my_db?charset=utf8", 30) |
| ... | @@ -40,39 +31,24 @@ func main() { | ... | @@ -40,39 +31,24 @@ func main() { |
| 40 | 31 | ||
| 41 | o := orm.NewOrm() | 32 | o := orm.NewOrm() |
| 42 | 33 | ||
| 43 | var user User | 34 | user := User{Name: "slene"} |
| 44 | obj := o.Object(&user) | ||
| 45 | 35 | ||
| 46 | // 创建 | 36 | // 创建 |
| 47 | user.Name = "slene" | 37 | id, err := o.Insert(&user) |
| 48 | id, err := obj.Insert() | ||
| 49 | fmt.Println(id, err) | 38 | fmt.Println(id, err) |
| 50 | 39 | ||
| 51 | // 更新 | 40 | // 更新 |
| 52 | user.Name = "astaxie" | 41 | user.Name = "astaxie" |
| 53 | num, err := obj.Update() | 42 | num, err := o.Update(&user) |
| 54 | fmt.Println(num, err) | 43 | fmt.Println(num, err) |
| 55 | 44 | ||
| 56 | // 查询单个 | 45 | // 查询单个 |
| 57 | var u User | 46 | u := User{Id: user.Id} |
| 58 | err = o.QueryTable("user").Filter("id", &user).One(&u) | 47 | err = o.Read(&u) |
| 59 | fmt.Println(u.Id, u.Name, err) | 48 | fmt.Println(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 | 49 | ||
| 74 | // 删除 | 50 | // 删除 |
| 75 | num, err = obj.Delete() // 默认,级联删除 user 以及关系存在的 post | 51 | num, err = o.Delete(&u) |
| 76 | fmt.Println(num, err) | 52 | fmt.Println(num, err) |
| 77 | } | 53 | } |
| 78 | ``` | 54 | ``` | ... | ... |
-
Please register or sign in to post a comment