5ccdaeb0 by slene

zh docs update

1 parent b0b64eb4
...@@ -8,14 +8,15 @@ note: 根据文档的更新,随时都可能更新这个 Model ...@@ -8,14 +8,15 @@ note: 根据文档的更新,随时都可能更新这个 Model
8 8
9 ##### models.go: 9 ##### models.go:
10 10
11 package main 11 ```go
12 package main
12 13
13 import ( 14 import (
14 "github.com/astaxie/beego/orm" 15 "github.com/astaxie/beego/orm"
15 "time" 16 "time"
16 ) 17 )
17 18
18 type User struct { 19 type User struct {
19 Id int `orm:"auto"` // 设置为auto主键 20 Id int `orm:"auto"` // 设置为auto主键
20 UserName string `orm:"size(30);unique"` // 设置字段为unique 21 UserName string `orm:"size(30);unique"` // 设置字段为unique
21 Email string `orm:"size(100)"` // 设置string字段长度时,会使用varchar类型 22 Email string `orm:"size(100)"` // 设置string字段长度时,会使用varchar类型
...@@ -28,34 +29,34 @@ note: 根据文档的更新,随时都可能更新这个 Model ...@@ -28,34 +29,34 @@ note: 根据文档的更新,随时都可能更新这个 Model
28 Profile *Profile `orm:"null;rel(one);on_delete(set_null)"` // OneToOne relation, 级联删除时设置为NULL 29 Profile *Profile `orm:"null;rel(one);on_delete(set_null)"` // OneToOne relation, 级联删除时设置为NULL
29 Posts []*Post `orm:"reverse(many)" json:"-"` // fk 的反向关系 30 Posts []*Post `orm:"reverse(many)" json:"-"` // fk 的反向关系
30 orm.Manager `json:"-"` // 每个model都需要定义orm.Manager 31 orm.Manager `json:"-"` // 每个model都需要定义orm.Manager
31 } 32 }
32 33
33 // 定义NewModel进行orm.Manager的初始化(必须) 34 // 定义NewModel进行orm.Manager的初始化(必须)
34 func NewUser() *User { 35 func NewUser() *User {
35 obj := new(User) 36 obj := new(User)
36 obj.Manager.Init(obj) 37 obj.Manager.Init(obj)
37 return obj 38 return obj
38 } 39 }
39 40
40 type Profile struct { 41 type Profile struct {
41 Id int `orm:"auto"` 42 Id int `orm:"auto"`
42 Age int16 `` 43 Age int16 ``
43 Money float64 `` 44 Money float64 ``
44 User *User `orm:"reverse(one)" json:"-"` // 设置反向关系(字段可选) 45 User *User `orm:"reverse(one)" json:"-"` // 设置反向关系(字段可选)
45 orm.Manager `json:"-"` 46 orm.Manager `json:"-"`
46 } 47 }
47 48
48 func (u *Profile) TableName() string { 49 func (u *Profile) TableName() string {
49 return "profile" // 自定义表名 50 return "profile" // 自定义表名
50 } 51 }
51 52
52 func NewProfile() *Profile { 53 func NewProfile() *Profile {
53 obj := new(Profile) 54 obj := new(Profile)
54 obj.Manager.Init(obj) 55 obj.Manager.Init(obj)
55 return obj 56 return obj
56 } 57 }
57 58
58 type Post struct { 59 type Post struct {
59 Id int `orm:"auto"` 60 Id int `orm:"auto"`
60 User *User `orm:"rel(fk)"` // RelForeignKey relation 61 User *User `orm:"rel(fk)"` // RelForeignKey relation
61 Title string `orm:"size(60)"` 62 Title string `orm:"size(60)"`
...@@ -64,29 +65,29 @@ note: 根据文档的更新,随时都可能更新这个 Model ...@@ -64,29 +65,29 @@ note: 根据文档的更新,随时都可能更新这个 Model
64 Updated time.Time `` 65 Updated time.Time ``
65 Tags []*Tag `orm:"rel(m2m)"` // ManyToMany relation 66 Tags []*Tag `orm:"rel(m2m)"` // ManyToMany relation
66 orm.Manager `json:"-"` 67 orm.Manager `json:"-"`
67 } 68 }
68 69
69 func NewPost() *Post { 70 func NewPost() *Post {
70 obj := new(Post) 71 obj := new(Post)
71 obj.Manager.Init(obj) 72 obj.Manager.Init(obj)
72 return obj 73 return obj
73 } 74 }
74 75
75 type Tag struct { 76 type Tag struct {
76 Id int `orm:"auto"` 77 Id int `orm:"auto"`
77 Name string `orm:"size(30)"` 78 Name string `orm:"size(30)"`
78 Status int16 `orm:"choices(0,1,2);default(0)"` 79 Status int16 `orm:"choices(0,1,2);default(0)"`
79 Posts []*Post `orm:"reverse(many)" json:"-"` 80 Posts []*Post `orm:"reverse(many)" json:"-"`
80 orm.Manager `json:"-"` 81 orm.Manager `json:"-"`
81 } 82 }
82 83
83 func NewTag() *Tag { 84 func NewTag() *Tag {
84 obj := new(Tag) 85 obj := new(Tag)
85 obj.Manager.Init(obj) 86 obj.Manager.Init(obj)
86 return obj 87 return obj
87 } 88 }
88 89
89 type Comment struct { 90 type Comment struct {
90 Id int `orm:"auto"` 91 Id int `orm:"auto"`
91 Post *Post `orm:"rel(fk)"` 92 Post *Post `orm:"rel(fk)"`
92 Content string `` 93 Content string ``
...@@ -94,22 +95,23 @@ note: 根据文档的更新,随时都可能更新这个 Model ...@@ -94,22 +95,23 @@ note: 根据文档的更新,随时都可能更新这个 Model
94 Status int16 `orm:"choices(0,1,2);default(0)"` 95 Status int16 `orm:"choices(0,1,2);default(0)"`
95 Created time.Time `orm:"auto_now_add"` 96 Created time.Time `orm:"auto_now_add"`
96 orm.Manager `json:"-"` 97 orm.Manager `json:"-"`
97 } 98 }
98 99
99 func NewComment() *Comment { 100 func NewComment() *Comment {
100 obj := new(Comment) 101 obj := new(Comment)
101 obj.Manager.Init(obj) 102 obj.Manager.Init(obj)
102 return obj 103 return obj
103 } 104 }
104 105
105 func init() { 106 func init() {
106 // 需要在init中注册定义的model 107 // 需要在init中注册定义的model
107 orm.RegisterModel(new(User)) 108 orm.RegisterModel(new(User))
108 orm.RegisterModel(new(Profile)) 109 orm.RegisterModel(new(Profile))
109 orm.RegisterModel(new(Post)) 110 orm.RegisterModel(new(Post))
110 orm.RegisterModel(new(Tag)) 111 orm.RegisterModel(new(Tag))
111 orm.RegisterModel(new(Comment)) 112 orm.RegisterModel(new(Comment))
112 } 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 ... 288 ...
285 Profile *Profile `orm:"null;rel(one);on_delete(set_null)"` 289 Profile *Profile `orm:"null;rel(one);on_delete(set_null)"`
286 ... 290 ...
287 type Profile struct { 291 type Profile struct {
288 ... 292 ...
289 User *User `orm:"reverse(one)" json:"-"` 293 User *User `orm:"reverse(one)" json:"-"`
290 294
291 删除 Profile 时将设置 User.Profile 的数据库字段为 NULL
...\ No newline at end of file ...\ No newline at end of file
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
7 import (
8 "fmt" 8 "fmt"
9 "github.com/astaxie/beego/orm" 9 "github.com/astaxie/beego/orm"
10 _ "github.com/go-sql-driver/mysql" 10 _ "github.com/go-sql-driver/mysql"
11 ) 11 )
12 12
13 func init() { 13 func init() {
14 // 这个用来设置 driverName 对应的数据库类型 14 // 这个用来设置 driverName 对应的数据库类型
15 // mysql / sqlite3 / postgres 这三种是默认已经注册过的,所以可以无需设置 15 // mysql / sqlite3 / postgres 这三种是默认已经注册过的,所以可以无需设置
16 orm.RegisterDriver("mysql", orm.DR_MySQL) 16 orm.RegisterDriver("mysql", orm.DR_MySQL)
...@@ -20,9 +20,10 @@ beego/orm 的使用方法 ...@@ -20,9 +20,10 @@ beego/orm 的使用方法
20 // 参数3 对应的链接字符串 20 // 参数3 对应的链接字符串
21 // 参数4 设置最大的空闲连接数,使用 golang 自己的连接池 21 // 参数4 设置最大的空闲连接数,使用 golang 自己的连接池
22 orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8", 30) 22 orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8", 30)
23 } 23 }
24 24
25 func main() { 25 func main() {
26 // 请确保在所有 RegisterModel 之前执行
26 orm.BootStrap() // 强制在 main 函数里调用,检查 Model 关系,检测数据库参数,调用 orm 提供的 Command 27 orm.BootStrap() // 强制在 main 函数里调用,检查 Model 关系,检测数据库参数,调用 orm 提供的 Command
27 28
28 o := orm.NewOrm() 29 o := orm.NewOrm()
...@@ -61,4 +62,5 @@ beego/orm 的使用方法 ...@@ -61,4 +62,5 @@ beego/orm 的使用方法
61 fmt.Println(u.Id, u.Profile) 62 fmt.Println(u.Id, u.Profile)
62 } 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
145 // LIMIT 1000
146 146
147 qs.Limit(10) 147 qs.Limit(10)
148 // LIMIT 10 148 // LIMIT 10
149 149
150 qs.Limit(10, 20) 150 qs.Limit(10, 20)
151 // LIMIT 10 OFFSET 20 151 // LIMIT 10 OFFSET 20
152 152
153 qs.Limit(-1) 153 qs.Limit(-1)
154 // no limit 154 // no limit
155
156 qs.Limit(-1, 100)
157 // LIMIT 18446744073709551615 OFFSET 100
158 // 18446744073709551615 是 1<<64 - 1 用来指定无 limit 限制 但有 offset 偏移的情况
159 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
185 qs := o.QueryTable("post")
186
187 qs.RelateSel()
188 // INNER JOIN user ... LEFT OUTER JOIN profile ...
189
190 qs.RelateSel("user")
191 // INNER JOIN user ...
192 // 设置 expr 只对设置的字段进行关系查询
193 186
194 // 对设置 null 属性的 Field 将使用 LEFT OUTER JOIN 187 qs.RelateSel()
188 // INNER JOIN user ... LEFT OUTER JOIN profile ...
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!