Save 會保存所有的字段,即使字段是零值
db.First(&user) |
更新單個列
當使用 Update 更新單個列時,你需要指定條件,否則會返回 ErrMissingWhereClause 錯誤,查看 Block Global Updates 獲取詳情。當使用了 Model 方法,且該對象主鍵有值,該值會被用於構建條件,例如:
// 條件更新 |
更新多列
Updates 方法支持 struct 和 map[string]interface{} 參數。當使用 struct 更新時,默認情況下,GORM 只會更新非零值的字段
// 根據 `struct` 更新屬性,只會更新非零值的字段 |
注意 當通過 struct 更新時,GORM 只會更新非零字段。 如果您想確保指定字段被更新,你應該使用
Select更新選定字段,或使用map來完成更新操作
更新選定字段
如果您想要在更新時選定、忽略某些字段,您可以使用 Select、Omit
// 使用 Map 進行 Select |
更新 Hook
對於更新操作,GORM 支持 BeforeSave、BeforeUpdate、AfterSave、AfterUpdate 鈎子,這些方法將在更新記錄時被調用,詳情請參閱 鈎子
func (u *User) BeforeUpdate(tx *gorm.DB) (err error) { |
批量更新
如果您尚未通過 Model 指定記錄的主鍵,則 GORM 會執行批量更新
// 根據 struct 更新 |
阻止全局更新
如果在沒有任何條件的情況下執行批量更新,默認情況下,GORM 不會執行該操作,並返回 ErrMissingWhereClause 錯誤
對此,你必須加一些條件,或者使用原生 SQL,或者啟用 AllowGlobalUpdate 模式,例如:
db.Model(&User{}).Update("name", "jinzhu").Error // gorm.ErrMissingWhereClause |
更新的記錄數
獲取受更新影響的行數
// 通過 `RowsAffected` 得到更新的記錄數 |
高級選項
使用 SQL 表達式更新
GORM 允許使用 SQL 表達式更新列,例如:
// product 的 ID 是 `3` |
並且 GORM 也允許使用 SQL 表達式、自定義數據類型的 Context Valuer 來更新,例如:
// 根據自定義數據類型創建 |
根據子查詢進行更新
使用子查詢更新表
db.Model(&user).Update("company_name", db.Model(&Company{}).Select("name").Where("companies.id = users.company_id")) |
不使用 Hook 和時間追蹤
如果您想在更新時跳過 Hook 方法且不追蹤更新時間,可以使用 UpdateColumn、UpdateColumns,其用法類似於 Update、Updates
// 更新單個列 |
Returning Data From Modified Rows
Return changed data, only works for database support Returning, for example:
// return all columns |
Check Field has changed?
GORM provides Changed method could be used in Before Update Hooks, it will return the field changed or not
The Changed method only works with methods Update, Updates, and it only checks if the updating value from Update / Updates equals the model value, will return true if it is changed and not omitted
func (u *User) BeforeUpdate(tx *gorm.DB) (err error) { |
Change Updating Values
To change updating values in Before Hooks, you should use SetColumn unless it is a full updates with Save, for example:
func (user *User) BeforeSave(tx *gorm.DB) (err error) { |
