5ccdaeb0 by slene

zh docs update

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