<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # ORM 使用方法 beego/orm 的使用例子 后文例子如無特殊說明都以這個為基礎。 ##### models.go: ~~~ package main import ( "github.com/astaxie/beego/orm" ) type User struct { Id int Name string Profile *Profile `orm:"rel(one)"` // OneToOne relation Post []*Post `orm:"reverse(many)"` // 設置一對多的反向關系 } type Profile struct { Id int Age int16 User *User `orm:"reverse(one)"` // 設置一對一反向關系(可選) } type Post struct { Id int Title string User *User `orm:"rel(fk)"` //設置一對多關系 Tags []*Tag `orm:"rel(m2m)"` } type Tag struct { Id int Name string Posts []*Post `orm:"reverse(many)"` } func init() { // 需要在init中注冊定義的model orm.RegisterModel(new(User), new(Post), new(Profile), new(Tag)) } ~~~ ##### main.go ~~~ package main import ( "fmt" "github.com/astaxie/beego/orm" _ "github.com/go-sql-driver/mysql" ) func init() { orm.RegisterDriver("mysql", orm.DRMySQL) orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8") } func main() { o := orm.NewOrm() o.Using("default") // 默認使用 default,你可以指定為其他數據庫 profile := new(Profile) profile.Age = 30 user := new(User) user.Profile = profile user.Name = "slene" fmt.Println(o.Insert(profile)) fmt.Println(o.Insert(user)) } ~~~ ## 數據庫的設置 目前 ORM 支持三種數據庫,以下為測試過的 driver 將你需要使用的 driver 加入 import 中 ~~~ import ( _ "github.com/go-sql-driver/mysql" _ "github.com/lib/pq" _ "github.com/mattn/go-sqlite3" ) ~~~ #### RegisterDriver 三種默認數據庫類型 ~~~ // For version 1.6 orm.DRMySQL orm.DRSqlite orm.DRPostgres // < 1.6 orm.DR_MySQL orm.DR_Sqlite orm.DR_Postgres ~~~ ~~~ // 參數1 driverName // 參數2 數據庫類型 // 這個用來設置 driverName 對應的數據庫類型 // mysql / sqlite3 / postgres 這三種是默認已經注冊過的,所以可以無需設置 orm.RegisterDriver("mysql", orm.DRMySQL) ~~~ #### RegisterDataBase ORM 必須注冊一個別名為`default`的數據庫,作為默認使用。 ORM 使用 golang 自己的連接池 ~~~ // 參數1 數據庫的別名,用來在 ORM 中切換數據庫使用 // 參數2 driverName // 參數3 對應的鏈接字符串 orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8") // 參數4(可選) 設置最大空閑連接 // 參數5(可選) 設置最大數據庫連接 (go >= 1.2) maxIdle := 30 maxConn := 30 orm.RegisterDataBase("default", "mysql", "root:root@/orm_test?charset=utf8", maxIdle, maxConn) ~~~ #### SetMaxIdleConns 根據數據庫的別名,設置數據庫的最大空閑連接 ~~~ orm.SetMaxIdleConns("default", 30) ~~~ #### SetMaxOpenConns 根據數據庫的別名,設置數據庫的最大數據庫連接 (go >= 1.2) ~~~ orm.SetMaxOpenConns("default", 30) ~~~ #### 時區設置 ORM 默認使用 time.Local 本地時區 * 作用于 ORM 自動創建的時間 * 從數據庫中取回的時間轉換成 ORM 本地時間 如果需要的話,你也可以進行更改 ~~~ // 設置為 UTC 時間 orm.DefaultTimeLoc = time.UTC ~~~ ORM 在進行 RegisterDataBase 的同時,會獲取數據庫使用的時區,然后在 time.Time 類型存取時做相應轉換,以匹配時間系統,從而保證時間不會出錯。 **注意:** * 鑒于 Sqlite3 的設計,存取默認都為 UTC 時間 * 使用 go-sql-driver 驅動時,請注意參數設置 從某一版本開始,驅動默認使用 UTC 時間,而非本地時間,所以請指定時區參數或者全部以 UTC 時間存取 例如:`root:root@/orm_test?charset=utf8&loc=Asia%2FShanghai` 參見[loc](https://github.com/go-sql-driver/mysql#loc)/[parseTime](https://github.com/go-sql-driver/mysql#parsetime) ## 注冊模型 如果使用 orm.QuerySeter 進行高級查詢的話,這個是必須的。 反之,如果只使用 Raw 查詢和 map struct,是無需這一步的。您可以去查看[Raw SQL 查詢](http://www.hmoore.net/oldlei/beego/1288515) #### RegisterModel 將你定義的 Model 進行注冊,最佳設計是有單獨的 models.go 文件,在他的 init 函數中進行注冊。 迷你版 models.go ~~~ package main import "github.com/astaxie/beego/orm" type User struct { Id int Name string } func init(){ orm.RegisterModel(new(User)) } ~~~ RegisterModel 也可以同時注冊多個 model ~~~ orm.RegisterModel(new(User), new(Profile), new(Post)) ~~~ 詳細的 struct 定義請查看文檔[模型定義](http://www.hmoore.net/oldlei/beego/1288518) #### RegisterModelWithPrefix 使用表名前綴 ~~~ orm.RegisterModelWithPrefix("prefix_", new(User)) ~~~ 創建后的表名為 prefix\_user #### NewOrmWithDB 有時候需要自行管理連接池與數據庫鏈接(比如:go 的鏈接池無法讓兩次查詢使用同一個鏈接的) 但又想使用 ORM 的查詢功能 ~~~ var driverName, aliasName string // driverName 是驅動的名稱 // aliasName 是當前 db 的自定義別名 var db *sql.DB ... o := orm.NewOrmWithDB(driverName, aliasName, db) ~~~ #### GetDB 從已注冊的數據庫返回 \*sql.DB 對象,默認返回別名為 default 的數據庫。 ~~~ db, err := orm.GetDB() if err != nil { fmt.Println("get default DataBase") } db, err := orm.GetDB("alias") if err != nil { fmt.Println("get alias DataBase") } ~~~ #### ResetModelCache 重置已經注冊的模型 struct,一般用于編寫測試用例 ~~~ orm.ResetModelCache() ~~~ ## ORM 接口使用 使用 ORM 必然接觸的 Ormer 接口,我們來熟悉一下 ~~~ var o orm.Ormer o = orm.NewOrm() // 創建一個 Ormer // NewOrm 的同時會執行 orm.BootStrap (整個 app 只執行一次),用以驗證模型之間的定義并緩存。 ~~~ 切換數據庫,或者,進行事務處理,都會作用于這個 Ormer 對象,以及其進行的任何查詢。 所以:需要**切換數據庫**和**事務處理**的話,不要使用全局保存的 Ormer 對象。 * type Ormer interface { * [Read(interface{}, ...string) error](http://www.hmoore.net/oldlei/beego/object.md#read) * [ReadOrCreate(interface{}, string, ...string) (bool, int64, error)](http://www.hmoore.net/oldlei/beego/object.md#readorcreate) * [Insert(interface{}) (int64, error)](http://www.hmoore.net/oldlei/beego/object.md#insert) * [InsertMulti(int, interface{}) (int64, error)](http://www.hmoore.net/oldlei/beego/object.md#insertmulti) * [Update(interface{}, ...string) (int64, error)](http://www.hmoore.net/oldlei/beego/object.md#update) * [Delete(interface{}) (int64, error)](http://www.hmoore.net/oldlei/beego/object.md#delete) * [LoadRelated(interface{}, string, ...interface{}) (int64, error)](http://www.hmoore.net/oldlei/beego/query.md#%E8%BD%BD%E5%85%A5%E5%85%B3%E7%B3%BB%E5%AD%97%E6%AE%B5) * [QueryM2M(interface{}, string) QueryM2Mer](http://www.hmoore.net/oldlei/beego/query.md#%E5%A4%9A%E5%AF%B9%E5%A4%9A%E5%85%B3%E7%B3%BB%E6%93%8D%E4%BD%9C) * [QueryTable(interface{}) QuerySeter](http://www.hmoore.net/oldlei/beego/1288512#querytable) * [Using(string) error](http://www.hmoore.net/oldlei/beego/1288512#using) * [Begin() error](http://www.hmoore.net/oldlei/beego/1288517) * [Commit() error](http://www.hmoore.net/oldlei/beego/1288517) * [Rollback() error](http://www.hmoore.net/oldlei/beego/1288517) * [Raw(string, ...interface{}) RawSeter](http://www.hmoore.net/oldlei/beego/1288512#raw) * [Driver() Driver](http://www.hmoore.net/oldlei/beego/1288512#driver) * } #### QueryTable 傳入表名,或者 Model 對象,返回一個[QuerySeter](http://www.hmoore.net/oldlei/beego/1288514) ~~~ o := orm.NewOrm() var qs orm.QuerySeter qs = o.QueryTable("user") // 如果表沒有定義過,會立刻 panic ~~~ #### Using 切換為其他數據庫 ~~~ orm.RegisterDataBase("db1", "mysql", "root:root@/orm_db2?charset=utf8") orm.RegisterDataBase("db2", "sqlite3", "data.db") o1 := orm.NewOrm() o1.Using("db1") o2 := orm.NewOrm() o2.Using("db2") // 切換為其他數據庫以后 // 這個 Ormer 對象的其下的 api 調用都將使用這個數據庫 ~~~ 默認使用`default`數據庫,無需調用 Using #### Raw 使用 sql 語句直接進行操作 Raw 函數,返回一個[RawSeter](http://www.hmoore.net/oldlei/beego/1288515)用以對設置的 sql 語句和參數進行操作 ~~~ o := orm.NewOrm() var r orm.RawSeter r = o.Raw("UPDATE user SET name = ? WHERE name = ?", "testing", "slene") ~~~ #### Driver 返回當前 ORM 使用的 db 信息 ~~~ type Driver interface { Name() string Type() DriverType } ~~~ ~~~ orm.RegisterDataBase("db1", "mysql", "root:root@/orm_db2?charset=utf8") orm.RegisterDataBase("db2", "sqlite3", "data.db") o1 := orm.NewOrm() o1.Using("db1") dr := o1.Driver() fmt.Println(dr.Name() == "db1") // true fmt.Println(dr.Type() == orm.DRMySQL) // true o2 := orm.NewOrm() o2.Using("db2") dr = o2.Driver() fmt.Println(dr.Name() == "db2") // true fmt.Println(dr.Type() == orm.DRSqlite) // true ~~~ ## 調試模式打印查詢語句 簡單的設置 Debug 為 true 打印查詢的語句 可能存在性能問題,不建議使用在生產模式 ~~~ func main() { orm.Debug = true ... ~~~ 默認使用 os.Stderr 輸出日志信息 改變輸出到你自己的 io.Writer ~~~ var w io.Writer ... // 設置為你的 io.Writer ... orm.DebugLog = orm.NewLog(w) ~~~ 日志格式 ~~~ [ORM] - 時間 - [Queries/數據庫名] - [執行操作/執行時間] - [SQL語句] - 使用標點 `,` 分隔的參數列表 - 打印遇到的錯誤 ~~~ ~~~ [ORM] - 2013-08-09 13:18:16 - [Queries/default] - [ db.Exec / 0.4ms] - [INSERT INTO `user` (`name`) VALUES (?)] - `slene` [ORM] - 2013-08-09 13:18:16 - [Queries/default] - [ db.Exec / 0.5ms] - [UPDATE `user` SET `name` = ? WHERE `id` = ?] - `astaxie`, `14` [ORM] - 2013-08-09 13:18:16 - [Queries/default] - [db.QueryRow / 0.4ms] - [SELECT `id`, `name` FROM `user` WHERE `id` = ?] - `14` [ORM] - 2013-08-09 13:18:16 - [Queries/default] - [ db.Exec / 0.4ms] - [INSERT INTO `post` (`user_id`,`title`,`content`) VALUES (?, ?, ?)] - `14`, `beego orm`, `powerful amazing` [ORM] - 2013-08-09 13:18:16 - [Queries/default] - [ db.Query / 0.4ms] - [SELECT T1.`name` `User__Name`, T0.`user_id` `User`, T1.`id` `User__Id` FROM `post` T0 INNER JOIN `user` T1 ON T1.`id` = T0.`user_id` WHERE T0.`id` = ? LIMIT 1000] - `68` [ORM] - 2013-08-09 13:18:16 - [Queries/default] - [ db.Exec / 0.4ms] - [DELETE FROM `user` WHERE `id` = ?] - `14` [ORM] - 2013-08-09 13:18:16 - [Queries/default] - [ db.Query / 0.3ms] - [SELECT T0.`id` FROM `post` T0 WHERE T0.`user_id` IN (?) ] - `14` [ORM] - 2013-08-09 13:18:16 - [Queries/default] - [ db.Exec / 0.4ms] - [DELETE FROM `post` WHERE `id` IN (?)] - `68` ~~~ 復制 日志內容包括**所有的數據庫操作**,事務,Prepare,等
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看