6e06720e by slene

zh docs update

1 parent 51baa35d
...@@ -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(&params); err != nil { 47 if cnt, err := o.QueryTable("user").RelatedSel().Limit(3).OrderBy("-id").Values(&params); 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 ```
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!