<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # ORM 使用方法 beego/orm 的使用例子 后文例子如無特殊說明都以這個為基礎。 ##### models.go: ```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 ```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 中 ```go import ( _ "github.com/go-sql-driver/mysql" _ "github.com/lib/pq" _ "github.com/mattn/go-sqlite3" ) ``` #### RegisterDriver 三種默認數據庫類型 ```go // For version 1.6 orm.DRMySQL orm.DRSqlite orm.DRPostgres // < 1.6 orm.DR_MySQL orm.DR_Sqlite orm.DR_Postgres ``` ```go // 參數1 driverName // 參數2 數據庫類型 // 這個用來設置 driverName 對應的數據庫類型 // mysql / sqlite3 / postgres 這三種是默認已經注冊過的,所以可以無需設置 orm.RegisterDriver("mysql", orm.DRMySQL) ``` #### RegisterDataBase ORM 必須注冊一個別名為 `default` 的數據庫,作為默認使用。 ORM 使用 golang 自己的連接池 ```go // 參數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 根據數據庫的別名,設置數據庫的最大空閑連接 ```go orm.SetMaxIdleConns("default", 30) ``` #### SetMaxOpenConns 根據數據庫的別名,設置數據庫的最大數據庫連接 (go >= 1.2) ```go orm.SetMaxOpenConns("default", 30) ``` #### 時區設置 ORM 默認使用 time.Local 本地時區 * 作用于 ORM 自動創建的時間 * 從數據庫中取回的時間轉換成 ORM 本地時間 如果需要的話,你也可以進行更改 ```go // 設置為 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 查詢](rawsql.md) #### RegisterModel 將你定義的 Model 進行注冊,最佳設計是有單獨的 models.go 文件,在他的 init 函數中進行注冊。 迷你版 models.go ```go package main import "github.com/astaxie/beego/orm" type User struct { Id int Name string } func init(){ orm.RegisterModel(new(User)) } ``` RegisterModel 也可以同時注冊多個 model ```go orm.RegisterModel(new(User), new(Profile), new(Post)) ``` 詳細的 struct 定義請查看文檔 [模型定義](./models.md) #### RegisterModelWithPrefix 使用表名前綴 ```go orm.RegisterModelWithPrefix("prefix_", new(User)) ``` 創建后的表名為 prefix_user #### NewOrmWithDB 有時候需要自行管理連接池與數據庫鏈接(比如:go 的鏈接池無法讓兩次查詢使用同一個鏈接的) 但又想使用 ORM 的查詢功能 ```go var driverName, aliasName string // driverName 是驅動的名稱 // aliasName 是當前 db 的自定義別名 var db *sql.DB ... o := orm.NewOrmWithDB(driverName, aliasName, db) ``` #### GetDB 從已注冊的數據庫返回 *sql.DB 對象,默認返回別名為 default 的數據庫。 ```go 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,一般用于編寫測試用例 ```go orm.ResetModelCache() ``` ## ORM 接口使用 使用 ORM 必然接觸的 Ormer 接口,我們來熟悉一下 ```go var o orm.Ormer o = orm.NewOrm() // 創建一個 Ormer // NewOrm 的同時會執行 orm.BootStrap (整個 app 只執行一次),用以驗證模型之間的定義并緩存。 ``` 切換數據庫,或者,進行事務處理,都會作用于這個 Ormer 對象,以及其進行的任何查詢。 所以:需要 **切換數據庫** 和 **事務處理** 的話,不要使用全局保存的 Ormer 對象。 * type Ormer interface { * [Read(interface{}, ...string) error](object.md#read) * [ReadOrCreate(interface{}, string, ...string) (bool, int64, error)](object.md#readorcreate) * [Insert(interface{}) (int64, error)](object.md#insert) * [InsertMulti(int, interface{}) (int64, error)](object.md#insertmulti) * [Update(interface{}, ...string) (int64, error)](object.md#update) * [Delete(interface{}) (int64, error)](object.md#delete) * [LoadRelated(interface{}, string, ...interface{}) (int64, error)](query.md#載入關系字段) * [QueryM2M(interface{}, string) QueryM2Mer](query.md#多對多關系操作) * [QueryTable(interface{}) QuerySeter](#querytable) * [Using(string) error](#using) * [Begin() error](transaction.md) * [Commit() error](transaction.md) * [Rollback() error](transaction.md) * [Raw(string, ...interface{}) RawSeter](#raw) * [Driver() Driver](#driver) * } #### QueryTable 傳入表名,或者 Model 對象,返回一個 [QuerySeter](query.md) ```go o := orm.NewOrm() var qs orm.QuerySeter qs = o.QueryTable("user") // 如果表沒有定義過,會立刻 panic ``` #### Using 切換為其他數據庫 ```go 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](rawsql.md) 用以對設置的 sql 語句和參數進行操作 ```go o := orm.NewOrm() var r orm.RawSeter r = o.Raw("UPDATE user SET name = ? WHERE name = ?", "testing", "slene") ``` #### Driver 返回當前 ORM 使用的 db 信息 ```go type Driver interface { Name() string Type() DriverType } ``` ```go 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 打印查詢的語句 可能存在性能問題,不建議使用在生產模式 ```go func main() { orm.Debug = true ... ``` 默認使用 os.Stderr 輸出日志信息 改變輸出到你自己的 io.Writer ```go var w io.Writer ... // 設置為你的 io.Writer ... orm.DebugLog = orm.NewLog(w) ``` 日志格式 ```go [ORM] - 時間 - [Queries/數據庫名] - [執行操作/執行時間] - [SQL語句] - 使用標點 `,` 分隔的參數列表 - 打印遇到的錯誤 ``` ```go [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>

                              哎呀哎呀视频在线观看