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

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 更新 ## 保存所有字段 `Save` 會保存所有的字段,即使字段是零值 ```go db.First(&user) user.Name = "jinzhu 2" user.Age = 100 db.Save(&user) // UPDATE users SET name='jinzhu 2', age=100, birthday='2016-01-01', updated_at = '2013-11-17 21:34:10' WHERE id=111; ``` ## Update/Updates 使用 `Update`、`Updates` 可以更新選定的字段 ```go // 更新單個字段 // the user of `Model(&user)` needs to have primary key value, it is `111` in this example db.Model(&user).Update("name", "hello") // UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111; // 根據條件更新單個字段 db.Model(&user).Where("active = ?", true).Update("name", "hello") // UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111 AND active=true; // 通過 `struct` 更新多個字段,不會更新零值字段 db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false}) // UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 21:34:10' WHERE id = 111; // 通過 `map` 更新多個字段,零值字段也會更新 db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false}) // UPDATE users SET name='hello', age=18, actived=false, updated_at='2013-11-17 21:34:10' WHERE id=111; ``` **注意** 當通過 struct 更新時,GORM 只會更新非零字段。 如果您想確保指定字段被更新,你應該使用 `Select` 更新選定字段,或使用 `map` 來完成更新操作 ## 更新選定字段 如果您想要在更新時選定、忽略某些字段,您可以使用 `Select`、`Omit` ```go // Select 與 Map // the user of `Model(&user)` needs to have primary key value, it is `111` in this example db.Model(&user).Select("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false}) // UPDATE users SET name='hello' WHERE id=111; db.Model(&user).Omit("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false}) // UPDATE users SET age=18, actived=false, updated_at='2013-11-17 21:34:10' WHERE id=111; // Select 與 Struct DB.Model(&result).Select("Name", "Age").Updates(User{Name: "new_name"}) // UPDATE users SET name='new_name', age=0 WHERE id=111; ``` ## 更新鉤子 對于更新操作,GORM 支持 `BeforeSave`、`BeforeUpdate`、`AfterSave`、`AfterUpdate` 鉤子,這些方法將在更新記錄時被調用,詳情請參閱 [鉤子](../教程/hooks.md) ```go func (u *User) BeforeUpdate(tx *gorm.DB) (err error) { if u.Role == "admin" { return errors.New("admin user not allowed to update") } return } ``` ## 批量更新 如果您尚未通過 `Model` 指定記錄的主鍵,則 GORM 會執行批量更新 ```go // 通過 struct 只能更新非零值,若要更新零值,可以使用 map[string]interface{} db.Model(User{}).Where("role = ?", "admin").Updates(User{Name: "hello", Age: 18}) // UPDATE users SET name='hello', age=18 WHERE role = 'admin; db.Table("users").Where("id IN (?)", []int{10, 11}).Updates(map[string]interface{}{"name": "hello", "age": 18}) // UPDATE users SET name='hello', age=18 WHERE id IN (10, 11); ``` ### 阻止全局更新 如果在沒有任何條件的情況下執行批量更新,GORM 不會執行該操作,并返回`ErrMissingWhereClause`錯誤 您可以使用 `1 = 1` 之類的條件來強制全局更新 ```go db.Model(&User{}).Update("name", "jinzhu").Error // gorm.ErrMissingWhereClause db.Model(&User{}).Where("1 = 1").Update("name", "jinzhu") // UPDATE users SET `name` = "jinzhu" WHERE 1=1 ``` ### 更新的記錄數 ```go // 通過 `RowsAffected` 得到更新的記錄數 result := db.Model(User{}).Where("role = ?", "admin").Updates(User{Name: "hello", Age: 18}) // UPDATE users SET name='hello', age=18 WHERE role = 'admin; result.RowsAffected // 更新的記錄數 result.Error // 更新的錯誤 ``` ## 高級用法 ### 通過 SQL 表達式更新 GORM 允許通過 SQL 表達式更新列 ```go DB.Model(&product).Update("price", gorm.Expr("price * ? + ?", 2, 100)) // UPDATE "products" SET "price" = price * '2' + '100', "updated_at" = '2013-11-17 21:34:10' WHERE "id" = '2'; DB.Model(&product).Updates(map[string]interface{}{"price": gorm.Expr("price * ? + ?", 2, 100)}) // UPDATE "products" SET "price" = price * '2' + '100', "updated_at" = '2013-11-17 21:34:10' WHERE "id" = '2'; DB.Model(&product).UpdateColumn("quantity", gorm.Expr("quantity - ?", 1)) // UPDATE "products" SET "quantity" = quantity - 1 WHERE "id" = '2'; DB.Model(&product).Where("quantity > 1").UpdateColumn("quantity", gorm.Expr("quantity - ?", 1)) // UPDATE "products" SET "quantity" = quantity - 1 WHERE "id" = '2' AND quantity > 1; ``` ### 不使用鉤子和時間追蹤 如果您想在更新時跳過 `鉤子` 方法和自動更新時間追蹤, 您可以使用 `UpdateColumn`、`UpdateColumns` ```go // 更新單列,用法類似于 `Update` db.Model(&user).UpdateColumn("name", "hello") // UPDATE users SET name='hello' WHERE id = 111; // 更新多列,用法類似于 `Updates` db.Model(&user).UpdateColumns(User{Name: "hello", Age: 18}) // UPDATE users SET name='hello', age=18 WHERE id = 111; // 配合 Select 更新多列,用法類似于 `Updates` db.Model(&user).Select("name", "age").UpdateColumns(User{Name: "hello"}) // UPDATE users SET name='hello', age=0 WHERE id = 111; ``` ### 檢查字段是否有變更? GORM 提供的 `Changed` 方法可以在 **Before** 鉤子中檢查字段是否有變更 `Changed` 方法只能與 `Update`、`Updates` 方法一起使用,它只是檢查 Model 對象字段的值與 `Update`、`Updates` 的值是否相等,以及該字段是否會被更新(例如,可以通過 Select、Omit 排除某些字段),如果不相等,則返回 true,并更新記錄 ```go func (u *User) BeforeUpdate(tx *gorm.DB) (err error) { // 如果 role 字段有變更 if tx.Statement.Changed("Role") { return errors.New("role not allowed to change") } if tx.Statement.Changed("Name", "Admin") { // 如果 Name 或 Role 字段有變更 tx.Statement.SetColumn("Age", 18) } // 如果任意字段有變更 if tx.Statement.Changed() { tx.Statement.SetColumn("RefreshedAt", time.Now()) } return nil } db.Model(&User{ID: 1, Name: "jinzhu"}).Updates(map[string]interface{"name": "jinzhu2"}) // Changed("Name") => true db.Model(&User{ID: 1, Name: "jinzhu"}).Updates(map[string]interface{"name": "jinzhu"}) // Changed("Name") => false, 因為 `Name` 沒有變更 db.Model(&User{ID: 1, Name: "jinzhu"}).Select("Admin").Updates(map[string]interface{ "name": "jinzhu2", "admin": false, }) // Changed("Name") => false, 因為 `Name` 沒有被 Select 選中并更新 db.Model(&User{ID: 1, Name: "jinzhu"}).Updates(User{Name: "jinzhu2"}) // Changed("Name") => true db.Model(&User{ID: 1, Name: "jinzhu"}).Updates(User{Name: "jinzhu"}) // Changed("Name") => false, 因為 `Name` 沒有變更 db.Model(&User{ID: 1, Name: "jinzhu"}).Select("Admin").Updates(User{Name: "jinzhu2"}) // Changed("Name") => false, 因為 `Name` 沒有被 Select 選中并更新 ``` ### 在更新時修改值 若要在 Before 鉤子中改變要更新的值,如果它是一個完整的更新,可以使用 `Save`;否則,應該使用 `scope.SetColumn` ,例如: ```go func (user *User) BeforeSave(scope *gorm.Scope) (err error) { if pw, err := bcrypt.GenerateFromPassword(user.Password, 0); err == nil { scope.SetColumn("EncryptedPassword", pw) } } db.Model(&user).Update("Name", "jinzhu") ```
                  <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>

                              哎呀哎呀视频在线观看