<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 功能強大 支持多語言、二開方便! 廣告
                # 創建 ## 創建記錄 ```go user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()} result := db.Create(&user) // 通過數據的指針來創建 user.ID // 返回插入數據的主鍵 result.Error // 返回 error result.RowsAffected // 返回插入記錄的條數 ``` ## 選定字段創建 用選定字段的來創建 ```go db.Select("Name", "Age", "CreatedAt").Create(&user) // INSERT INTO `users` (`name`,`age`,`created_at`) VALUES ("jinzhu", 18, "2020-07-04 11:05:21.775") ``` 創建時排除選定字段 ```go db.Omit("Name", "Age", "CreatedAt").Create(&user) // INSERT INTO `users` (`birthday`,`updated_at`) VALUES ("2020-01-01 00:00:00.000", "2020-07-04 11:05:21.775") ``` ## 創建鉤子 GORM 允許 `BeforeSave`, `BeforeCreate`, `AfterSave`, `AfterCreate` 等鉤子,創建記錄時會調用這些方法, 詳情請參閱 [鉤子](../教程/hooks.md) ```go func (u *User) BeforeCreate(tx *gorm.DB) (err error) { u.UUID = uuid.New() if u.Role == "admin" { return errors.New("invalid role") } return } ``` ## 批量插入 將切片數據傳遞給 `Create` 方法,GORM 將生成一個單一的 SQL 語句來插入所有數據,并回填主鍵的值,鉤子方法也會被調用。 ```go var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}} DB.Create(&users) for _, user := range users { user.ID // 1,2,3 } ``` [Upsert](http://v2.gorm.io/zh_CN/docs/create.html#upsert)、[關聯創建](http://v2.gorm.io/zh_CN/docs/create.html#create_with_associations) 同樣支持批量插入 ## 高級 ### 關聯創建 如果您的模型定義了任何關系(relation),并且它有非零關系,那么在創建時這些數據也會被保存 ```go type CreditCard struct { gorm.Model Number string UserID uint } type User struct { gorm.Model Name string CreditCard CreditCard } db.Create(&User{ Name: "jinzhu", CreditCard: CreditCard{Number: "411111111111"} }) // INSERT INTO `users` ... // INSERT INTO `credit_cards` ... ``` 您也可以通過 `Select`、 `Omit` 跳過關聯保存 ```go db.Omit("CreditCard").Create(&user) // 跳過所有關聯 db.Omit(clause.Associations).Create(&user) ``` ### 默認值 您可以通過標簽 `default` 為字段定義默認值,如: ```go type User struct { ID int64 Name string `gorm:"default:'galeone'"` Age int64 `gorm:"default:18"` uuid.UUID UUID `gorm:"type:uuid;default:gen_random_uuid()"` // db 函數 } ``` 插入記錄到數據庫時,[零值](https://tour.golang.org/basics/12) 字段將使用默認值 **注意** 像 `0`、`''`、`false` 等零值,不會將這些字段定義的默認值保存到數據庫。您需要使用指針類型或 Scanner/Valuer 來避免這個問題,例如: ```go type User struct { gorm.Model Name string Age *int `gorm:"default:18"` Active sql.NullBool `gorm:"default:true"` } ``` **注意** 對于在數據庫中有默認值的字段,你必須為其 struct 設置 `default` 標簽,否則 GORM 將在創建時使用該字段的零值,例如: ```go type User struct { ID string `gorm:"default:uuid_generate_v3()"` Name string Age uint8 } ``` ### Upsert 及沖突 GORM 為不同數據庫提供了兼容的 Upsert 支持 ```go import "gorm.io/gorm/clause" // 不處理沖突 DB.Clauses(clause.OnConflict{DoNothing: true}).Create(&user) // `id` 沖突時,將字段值更新為默認值 DB.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "id"}}, DoUpdates: clause.Assignments(map[string]interface{}{"role": "user"}), }).Create(&users) // MERGE INTO "users" USING *** WHEN NOT MATCHED THEN INSERT *** WHEN MATCHED THEN UPDATE SET ***; SQL Server // INSERT INTO `users` *** ON DUPLICATE KEY UPDATE ***; MySQL // Update columns to new value on `id` conflict DB.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "id"}}, DoUpdates: clause.AssignmentColumns([]string{"name", "age"}), }).Create(&users) // MERGE INTO "users" USING *** WHEN NOT MATCHED THEN INSERT *** WHEN MATCHED THEN UPDATE SET "name"="excluded"."name"; SQL Server // INSERT INTO "users" *** ON CONFLICT ("id") DO UPDATE SET "name"="excluded"."name", "age"="excluded"."age"; PostgreSQL // INSERT INTO `users` *** ON DUPLICATE KEY UPDATE `name`=VALUES(name),`age=VALUES(age); MySQL ``` 也可以查看 [高級查詢](./advanced_query.md) 中的 `FirstOrInit`, `FirstOrCreate` 查看 [原生 SQL 及構造器](./sql_builder.md) 獲取更多細節
                  <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>

                              哎呀哎呀视频在线观看