zh docs update
Showing
5 changed files
with
231 additions
and
57 deletions
| ... | @@ -105,11 +105,8 @@ func NewComment() *Comment { | ... | @@ -105,11 +105,8 @@ func NewComment() *Comment { |
| 105 | 105 | ||
| 106 | func init() { | 106 | func init() { |
| 107 | // 需要在init中注册定义的model | 107 | // 需要在init中注册定义的model |
| 108 | orm.RegisterModel(new(User)) | 108 | orm.RegisterModel(new(User), new(Profile)) |
| 109 | orm.RegisterModel(new(Profile)) | 109 | orm.RegisterModel(new(Post), new(Tag), new(Comment)) |
| 110 | orm.RegisterModel(new(Post)) | ||
| 111 | orm.RegisterModel(new(Tag)) | ||
| 112 | orm.RegisterModel(new(Comment)) | ||
| 113 | } | 110 | } |
| 114 | ``` | 111 | ``` |
| 115 | 112 | ... | ... |
| ... | @@ -12,7 +12,7 @@ fmt.Println(o.Insert(user)) | ... | @@ -12,7 +12,7 @@ fmt.Println(o.Insert(user)) |
| 12 | 12 | ||
| 13 | user.UserName = "Your" | 13 | user.UserName = "Your" |
| 14 | fmt.Println(o.Update(user)) | 14 | fmt.Println(o.Update(user)) |
| 15 | 15 | fmt.Println(o.Read(user)) | |
| 16 | fmt.Println(o.Delete(user)) | 16 | fmt.Println(o.Delete(user)) |
| 17 | ``` | 17 | ``` |
| 18 | ### Read | 18 | ### Read |
| ... | @@ -36,7 +36,7 @@ o := orm.NewOrm() | ... | @@ -36,7 +36,7 @@ o := orm.NewOrm() |
| 36 | var user User | 36 | var user User |
| 37 | user.UserName = "slene" | 37 | user.UserName = "slene" |
| 38 | user.Password = "password" | 38 | user.Password = "password" |
| 39 | user.Email = "vslene@gmail.com" | 39 | user.Email = "vslene@gmail.com"[]() |
| 40 | user.IsActive = true | 40 | user.IsActive = true |
| 41 | 41 | ||
| 42 | fmt.Println(o.Insert(&user)) | 42 | fmt.Println(o.Insert(&user)) | ... | ... |
| 1 | ## Orm | 1 | ## Orm |
| 2 | 2 | ||
| 3 | beego/orm 的使用方法 | 3 | beego/orm 的使用例子 |
| 4 | ```go | 4 | ```go |
| 5 | package main | 5 | package main |
| 6 | 6 | ||
| ... | @@ -11,21 +11,12 @@ import ( | ... | @@ -11,21 +11,12 @@ import ( |
| 11 | ) | 11 | ) |
| 12 | 12 | ||
| 13 | func init() { | 13 | func init() { |
| 14 | // 这个用来设置 driverName 对应的数据库类型 | ||
| 15 | // mysql / sqlite3 / postgres 这三种是默认已经注册过的,所以可以无需设置 | ||
| 16 | orm.RegisterDriver("mysql", orm.DR_MySQL) | 14 | orm.RegisterDriver("mysql", orm.DR_MySQL) |
| 17 | 15 | ||
| 18 | // 参数1 自定义的数据库名称,用来在orm中切换数据库使用 | ||
| 19 | // 参数2 driverName | ||
| 20 | // 参数3 对应的链接字符串 | ||
| 21 | // 参数4 设置最大的空闲连接数,使用 golang 自己的连接池 | ||
| 22 | orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8", 30) | 16 | orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8", 30) |
| 23 | } | 17 | } |
| 24 | 18 | ||
| 25 | func main() { | 19 | func main() { |
| 26 | // 请确保在所有 RegisterModel 之前执行 | ||
| 27 | orm.BootStrap() // 强制在 main 函数里调用,检查 Model 关系,检测数据库参数,调用 orm 提供的 Command | ||
| 28 | |||
| 29 | o := orm.NewOrm() | 20 | o := orm.NewOrm() |
| 30 | o.Using("default") // 默认使用 default,你可以指定为其他数据库 | 21 | o.Using("default") // 默认使用 default,你可以指定为其他数据库 |
| 31 | 22 | ||
| ... | @@ -42,25 +33,134 @@ func main() { | ... | @@ -42,25 +33,134 @@ func main() { |
| 42 | 33 | ||
| 43 | fmt.Println(o.Insert(profile)) | 34 | fmt.Println(o.Insert(profile)) |
| 44 | fmt.Println(o.Insert(user)) | 35 | fmt.Println(o.Insert(user)) |
| 36 | } | ||
| 37 | ``` | ||
| 38 | |||
| 39 | #### RegisterDriver | ||
| 40 | |||
| 41 | 三种数据库类型 | ||
| 42 | |||
| 43 | ```go | ||
| 44 | orm.DR_MySQL | ||
| 45 | orm.DR_Sqlite | ||
| 46 | orm.DR_Postgres | ||
| 47 | ``` | ||
| 48 | |||
| 49 | ```go | ||
| 50 | // 参数1 driverName | ||
| 51 | // 参数2 数据库类型 | ||
| 52 | // 这个用来设置 driverName 对应的数据库类型 | ||
| 53 | // mysql / sqlite3 / postgres 这三种是默认已经注册过的,所以可以无需设置 | ||
| 54 | orm.RegisterDriver("mysql", orm.DR_MySQL) | ||
| 55 | ``` | ||
| 56 | |||
| 57 | #### RegisterDataBase | ||
| 58 | |||
| 59 | orm 必须注册一个名称为 `default` 的数据库,用以作为默认使用。 | ||
| 60 | |||
| 61 | ```go | ||
| 62 | // 参数1 自定义数据库名称,用来在orm中切换数据库使用 | ||
| 63 | // 参数2 driverName | ||
| 64 | // 参数3 对应的链接字符串 | ||
| 65 | // 参数4 设置最大的空闲连接数,使用 golang 自己的连接池 | ||
| 66 | orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8", 30) | ||
| 67 | ``` | ||
| 68 | |||
| 69 | ## Ormer | ||
| 70 | |||
| 71 | ```go | ||
| 72 | var o Ormer | ||
| 73 | o = orm.NewOrm() // 创建一个 Ormer | ||
| 74 | // NewOrm 的同时会执行一次 orm.BootStrap,用以验证模型之间的定义并缓存。 | ||
| 75 | ``` | ||
| 76 | |||
| 77 | * type Ormer interface { | ||
| 78 | * [Read(Modeler) error](Object.md#Read) | ||
| 79 | * [Insert(Modeler) (int64, error)](Object.md#Insert) | ||
| 80 | * [Update(Modeler) (int64, error)](Object.md#Update) | ||
| 81 | * [Delete(Modeler) (int64, error)](Object.md#Delete) | ||
| 82 | * [M2mAdd(Modeler, string, ...interface{}) (int64, error)](Object.md#M2mAdd) | ||
| 83 | * [M2mDel(Modeler, string, ...interface{}) (int64, error)](Object.md#M2mDel) | ||
| 84 | * [LoadRel(Modeler, string) (int64, error)](Object.md#LoadRel) | ||
| 85 | * [QueryTable(interface{}) QuerySeter](#QueryTable) | ||
| 86 | * [Using(string) error](#Using) | ||
| 87 | * [Begin() error](Transaction.md#Begin) | ||
| 88 | * [Commit() error](Transaction.md#Commit) | ||
| 89 | * [Rollback() error](Transaction.md#Rollback) | ||
| 90 | * [Raw(string, ...interface{}) RawSeter](#Raw) | ||
| 91 | * [Driver() Driver](#Driver) | ||
| 92 | * } | ||
| 93 | |||
| 94 | |||
| 95 | #### QueryTable | ||
| 96 | |||
| 97 | 传入表名,或者 Modeler 对象,返回一个 [QuerySeter](Query.md#QuerySeter) | ||
| 98 | |||
| 99 | ```go | ||
| 100 | o := orm.NewOrm() | ||
| 101 | var qs QuerySeter | ||
| 102 | qs = o.QueryTable("user") | ||
| 103 | // 如果表没有定义过,会立刻 panic | ||
| 104 | ``` | ||
| 105 | |||
| 106 | #### Using | ||
| 45 | 107 | ||
| 46 | var params []orm.Params | 108 | 切换为其他数据库 |
| 47 | if cnt, err := o.QueryTable("user").RelatedSel().Limit(3).OrderBy("-id").Values(¶ms); err != nil { | 109 | |
| 48 | fmt.Println(err) | 110 | ```go |
| 49 | } else { | 111 | orm.RegisterDataBase("db1", "mysql", "root:root@/orm_db2?charset=utf8", 30) |
| 50 | fmt.Println(cnt) | 112 | orm.RegisterDataBase("db2", "sqlite3", "data.db", 30) |
| 51 | for _, p := range params { | 113 | |
| 52 | fmt.Println(p) | 114 | o1 := orm.NewOrm() |
| 53 | } | 115 | o1.Using("db1") |
| 54 | } | 116 | |
| 55 | 117 | o2 := orm.NewOrm() | |
| 56 | var users []*User | 118 | o2.Using("db2") |
| 57 | if cnt, err := o.QueryTable("user").RelatedSel().Limit(3).OrderBy("-id").All(&users); err != nil { | 119 | |
| 58 | fmt.Println(err) | 120 | // 切换为其他数据库以后 |
| 59 | } else { | 121 | // 这个 Ormer 对象的其下的 api 调用都将使用这个数据库 |
| 60 | fmt.Println(cnt) | 122 | |
| 61 | for _, u := range users { | 123 | ``` |
| 62 | fmt.Println(u.Id, u.Profile) | 124 | |
| 63 | } | 125 | 默认使用 `default` 数据库,无需调用 Using |
| 64 | } | 126 | |
| 127 | #### Raw | ||
| 128 | |||
| 129 | 使用 sql 语句直接进行操作 | ||
| 130 | |||
| 131 | Raw 函数,返回一个 [RawSeter](Raw.md) 用以对设置的 sql 语句和参数进行操作 | ||
| 132 | |||
| 133 | ```go | ||
| 134 | o := NewOrm() | ||
| 135 | var r RawSeter | ||
| 136 | r = o.Raw("UPDATE user SET user_name = ? WHERE user_name = ?", "testing", "slene") | ||
| 137 | ``` | ||
| 138 | |||
| 139 | #### Driver | ||
| 140 | |||
| 141 | 返回当前 orm 使用的 db 信息 | ||
| 142 | |||
| 143 | ```go | ||
| 144 | type Driver interface { | ||
| 145 | Name() string | ||
| 146 | Type() DriverType | ||
| 65 | } | 147 | } |
| 66 | ``` | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 148 | ``` | ||
| 149 | |||
| 150 | ```go | ||
| 151 | orm.RegisterDataBase("db1", "mysql", "root:root@/orm_db2?charset=utf8", 30) | ||
| 152 | orm.RegisterDataBase("db2", "sqlite3", "data.db", 30) | ||
| 153 | |||
| 154 | o1 := orm.NewOrm() | ||
| 155 | o1.Using("db1") | ||
| 156 | dr := o1.Driver() | ||
| 157 | fmt.Println(dr.Name() == "db1") // true | ||
| 158 | fmt.Println(dr.Type() == orm.DR_MySQL) // true | ||
| 159 | |||
| 160 | o2 := orm.NewOrm() | ||
| 161 | o2.Using("db2") | ||
| 162 | dr = o2.Driver() | ||
| 163 | fmt.Println(dr.Name() == "db2") // true | ||
| 164 | fmt.Println(dr.Type() == orm.DR_Sqlite) // true | ||
| 165 | |||
| 166 | ``` | ... | ... |
| ... | @@ -13,7 +13,7 @@ qs := o.QueryTable("user") | ... | @@ -13,7 +13,7 @@ qs := o.QueryTable("user") |
| 13 | user := NewUser() | 13 | user := NewUser() |
| 14 | qs = o.QueryTable(user) // 返回 QuerySeter | 14 | qs = o.QueryTable(user) // 返回 QuerySeter |
| 15 | ``` | 15 | ``` |
| 16 | ### expr | 16 | ## expr |
| 17 | 17 | ||
| 18 | QuerySeter 中用于描述字段和 sql 操作符使用简单的 expr 查询方法 | 18 | QuerySeter 中用于描述字段和 sql 操作符使用简单的 expr 查询方法 |
| 19 | 19 | ||
| ... | @@ -32,9 +32,20 @@ qs.Filter("profile__age__in", 18, 20) // WHERE profile.age IN (18, 20) | ... | @@ -32,9 +32,20 @@ qs.Filter("profile__age__in", 18, 20) // WHERE profile.age IN (18, 20) |
| 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 | 当前支持的操作符号: |
| 38 | |||
| 39 | * [exact](#exact) / [iexact](#iexact) 等于 | ||
| 40 | * [contains](#contains) / [icontains](#icontains) 包含 | ||
| 41 | * [gt / gte](#gt / gte) 大于 / 大于等于 | ||
| 42 | * [lt / lte](#lt / lte) 小于 / 小于等于 | ||
| 43 | * [startswith](#startswith) / [istartswith](#istartswith) 以...起始 | ||
| 44 | * [endswith](#endswith) / [iendswith](#iendswith) 以...结束 | ||
| 45 | * [in](#in) | ||
| 46 | * [isnull](#isnull) | ||
| 47 | |||
| 48 | 后面以 `i` 开头的表示:大小写不敏感 | ||
| 38 | 49 | ||
| 39 | #### exact | 50 | #### exact |
| 40 | 51 | ||
| ... | @@ -119,6 +130,29 @@ qs.Filter("profile__isnull", false) | ... | @@ -119,6 +130,29 @@ qs.Filter("profile__isnull", false) |
| 119 | ``` | 130 | ``` |
| 120 | ## QuerySeter | 131 | ## QuerySeter |
| 121 | 132 | ||
| 133 | QuerySeter 当前支持的方法 | ||
| 134 | |||
| 135 | * type QuerySeter interface { | ||
| 136 | * [Filter(string, ...interface{}) QuerySeter](#Filter) | ||
| 137 | * [Exclude(string, ...interface{}) QuerySeter](#Exclude) | ||
| 138 | * [SetCond(*Condition) QuerySeter](#SetCond) | ||
| 139 | * [Limit(int, ...int64) QuerySeter](#Limit) | ||
| 140 | * [Offset(int64) QuerySeter](#Offset) | ||
| 141 | * [OrderBy(...string) QuerySeter](#OrderBy) | ||
| 142 | * [RelatedSel(...interface{}) QuerySeter](#RelatedSel) | ||
| 143 | * [Count() (int64, error)](#Count) | ||
| 144 | * [Update(Params) (int64, error)](#Update) | ||
| 145 | * [Delete() (int64, error)](#Delete) | ||
| 146 | * [PrepareInsert() (Inserter, error)](#PrepareInsert) | ||
| 147 | * [All(interface{}) (int64, error)](#All) | ||
| 148 | * [One(Modeler) error](#One) | ||
| 149 | * [Values(*[]Params, ...string) (int64, error)](#Values) | ||
| 150 | * [ValuesList(*[]ParamsList, ...string) (int64, error)](#ValuesList) | ||
| 151 | * [ValuesFlat(*ParamsList, string) (int64, error)](#ValuesFlat) | ||
| 152 | * } | ||
| 153 | |||
| 154 | 每个返回 QuerySeter 的 api 调用时都会新建一个 QuerySeter,不影响之前创建的。 | ||
| 155 | |||
| 122 | #### Filter | 156 | #### Filter |
| 123 | 157 | ||
| 124 | 多个 Filter 之间使用 `AND` 连接 | 158 | 多个 Filter 之间使用 `AND` 连接 |
| ... | @@ -139,6 +173,21 @@ qs.Exclude("profile__isnull", true).Filter("user_name", "slene") | ... | @@ -139,6 +173,21 @@ qs.Exclude("profile__isnull", true).Filter("user_name", "slene") |
| 139 | 173 | ||
| 140 | #### SetCond | 174 | #### SetCond |
| 141 | 175 | ||
| 176 | 自定义条件表达式 | ||
| 177 | |||
| 178 | ```go | ||
| 179 | cond := NewCondition() | ||
| 180 | cond1 := cond.And("profile__isnull", false).AndNot("status__in", 1).Or("profile__age__gt", 2000) | ||
| 181 | |||
| 182 | qs := orm.QueryTable("user") | ||
| 183 | qs = qs.SetCond(cond1) | ||
| 184 | // WHERE ... AND ... AND NOT ... OR ... | ||
| 185 | |||
| 186 | cond2 := cond.AndCond(cond1).OrCond(cond.And("user_name", "slene")) | ||
| 187 | qs = qs.SetCond(cond2).Count() | ||
| 188 | // WHERE (... AND ... AND NOT ... OR ...) OR ( ... ) | ||
| 189 | ``` | ||
| 190 | |||
| 142 | #### Limit | 191 | #### Limit |
| 143 | 192 | ||
| 144 | 限制最大返回数据行数,第二个参数可以设置 `Offset` | 193 | 限制最大返回数据行数,第二个参数可以设置 `Offset` |
| ... | @@ -166,7 +215,7 @@ qs.Limit(-1, 100) | ... | @@ -166,7 +215,7 @@ qs.Limit(-1, 100) |
| 166 | 215 | ||
| 167 | 设置 偏移行数 | 216 | 设置 偏移行数 |
| 168 | ```go | 217 | ```go |
| 169 | qs.OFFSET(20) | 218 | qs.Offset(20) |
| 170 | // LIMIT 1000 OFFSET 20 | 219 | // LIMIT 1000 OFFSET 20 |
| 171 | ``` | 220 | ``` |
| 172 | 221 | ||
| ... | @@ -226,6 +275,28 @@ fmt.Printf("Affected Num: %s, %s", num, err) | ... | @@ -226,6 +275,28 @@ fmt.Printf("Affected Num: %s, %s", num, err) |
| 226 | // DELETE FROM user WHERE user_name = "slene" | 275 | // DELETE FROM user WHERE user_name = "slene" |
| 227 | ``` | 276 | ``` |
| 228 | 277 | ||
| 278 | #### PrepareInsert | ||
| 279 | |||
| 280 | 用于一次 prepare 多次 insert 插入,以提高批量插入的速度。 | ||
| 281 | |||
| 282 | ```go | ||
| 283 | var users []*User | ||
| 284 | ... | ||
| 285 | qs := dORM.QueryTable("user") | ||
| 286 | i, _ := qs.PrepareInsert() | ||
| 287 | for _, user := range users { | ||
| 288 | id, err := i.Insert(user) | ||
| 289 | if err != nil { | ||
| 290 | ... | ||
| 291 | } | ||
| 292 | } | ||
| 293 | // PREPARE INSERT INTO user (`user_name`, ...) VALUES (?, ...) | ||
| 294 | // EXECUTE INSERT INTO user (`user_name`, ...) VALUES ("slene", ...) | ||
| 295 | // EXECUTE ... | ||
| 296 | // ... | ||
| 297 | i.Close() // 别忘记关闭 statement | ||
| 298 | ``` | ||
| 299 | |||
| 229 | #### All | 300 | #### All |
| 230 | 返回对应的结果集对象 | 301 | 返回对应的结果集对象 |
| 231 | ```go | 302 | ```go |
| ... | @@ -235,13 +306,20 @@ fmt.Printf("Returned Rows Num: %s, %s", num, err) | ... | @@ -235,13 +306,20 @@ fmt.Printf("Returned Rows Num: %s, %s", num, err) |
| 235 | ``` | 306 | ``` |
| 236 | 307 | ||
| 237 | #### One | 308 | #### One |
| 238 | 尝试返回单个对象 | 309 | |
| 310 | 尝试返回单条记录 | ||
| 311 | |||
| 239 | ```go | 312 | ```go |
| 240 | var user *User | 313 | var user *User |
| 241 | err := o.QueryTable("user").Filter("user_name", "slene").One(&user) | 314 | err := o.QueryTable("user").Filter("user_name", "slene").One(&user) |
| 242 | if err == orm.ErrMultiRows { | 315 | if err == orm.ErrMultiRows { |
| 316 | // 多条的时候报错 | ||
| 243 | fmt.Printf("Returned Multi Rows Not One") | 317 | fmt.Printf("Returned Multi Rows Not One") |
| 244 | } | 318 | } |
| 319 | if err == orm.ErrNoRows { | ||
| 320 | // 没有找到记录 | ||
| 321 | fmt.Printf("Not row found") | ||
| 322 | } | ||
| 245 | ``` | 323 | ``` |
| 246 | 324 | ||
| 247 | #### Values | 325 | #### Values |
| ... | @@ -323,10 +401,5 @@ if err != nil { | ... | @@ -323,10 +401,5 @@ if err != nil { |
| 323 | } | 401 | } |
| 324 | ``` | 402 | ``` |
| 325 | 403 | ||
| 326 | #### PrepareInsert | ||
| 327 | |||
| 328 | 用于批量插入 prepare -> insert -> insert | ||
| 329 | |||
| 330 | |||
| 331 | 404 | ||
| 332 | 405 | ... | ... |
| ... | @@ -27,8 +27,6 @@ func init() { | ... | @@ -27,8 +27,6 @@ func init() { |
| 27 | } | 27 | } |
| 28 | 28 | ||
| 29 | func main() { | 29 | func main() { |
| 30 | orm.BootStrap() // 确保在所有 RegisterModel 之后执行 | ||
| 31 | |||
| 32 | o := orm.NewOrm() | 30 | o := orm.NewOrm() |
| 33 | 31 | ||
| 34 | user := User{Name: "slene"} | 32 | user := User{Name: "slene"} |
| ... | @@ -55,12 +53,18 @@ func main() { | ... | @@ -55,12 +53,18 @@ func main() { |
| 55 | 53 | ||
| 56 | ## 详细文档 | 54 | ## 详细文档 |
| 57 | 55 | ||
| 58 | 1. [Model Definition](Models.md) | 56 | 1. [模型定义](Models.md) |
| 57 | - [支持的 Field 类型](Models.md#Field Type) | ||
| 58 | - [Field 设置参数](Models.md#Field Options) | ||
| 59 | - [关系型 Field 设置](Models.md#Relation Field Options) | ||
| 59 | 2. Custom Fields | 60 | 2. Custom Fields |
| 60 | 3. [Orm](Orm.md) | 61 | 3. [Orm 使用方法](Orm.md) |
| 61 | 4. [Object](Object.md) | 62 | - [Ormer 接口](Orm.md#Ormer) |
| 62 | 5. [Query](Query.md) | 63 | 4. [对象操作](Object.md) |
| 63 | 6. Condition | 64 | 5. [复杂查询](Query.md) |
| 64 | 7. Raw | 65 | - [查询使用的表达式语法](Query.md#expr) |
| 65 | 8. Transaction | 66 | - [查询支持的操作符号](Query.md#Operators) |
| 66 | 9. Faq | 67 | - [QuerySeter 接口](Query.md#QuerySeter) |
| 68 | 6. Raw | ||
| 69 | 7. Transaction | ||
| 70 | 8. Faq | ... | ... |
-
Please register or sign in to post a comment