Save會保存所有的字段,即使字段是零值
db.First(&user)
user.Name = "張三"
user.Age = 100
db.Save(&user)
// UPDATE users SET name='張三', age=100, birthday='2013-01-01', updated_at = '2022-03-04 09:34:10' WHERE id=111;
當使用Update更新單個列時,你需要指定條件,否則會返回ErrMissingWhereClause錯誤;當使用了 Model 方法,且該對象主鍵有值,該值會被用于構(gòu)建條件,例如:
// 條件更新
db.Model(&User{}).Where("active = ?", true).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2022-03-04 09:39:10' WHERE active=true;
// User 的 ID 是 `001`
db.Model(&user).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2022-03-04 09:39:10' WHERE id=001;
// 根據(jù)條件和 model 的值進行更新
db.Model(&user).Where("active = ?", true).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2022-03-04 09:39:10' WHERE id=001 AND active=true;
Updates方法支持struct和map[string]interface{}參數(shù)。當使用struct更新時,默認情況下,GORM只會更新非零值的字段
// 根據(jù) `struct` 更新屬性,只會更新非零值的字段
db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false})
// UPDATE users SET name='hello', age=18, updated_at = '2022-03-04 09:42:10' WHERE id = 001;
// 根據(jù) `map` 更新屬性
db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
// UPDATE users SET name='hello', age=18, active=false, updated_at='2022-03-04 09:42:10' WHERE id=001;
注意:當通過struct更新時,GORM只會更新非零字段。如果您想確保指定字段被更新,你應(yīng)該使用Select更新選定字段,或使用map來完成更新操作
如果你想要在更新時選定,忽略某些字段,您可以使用Select,Omit
// 使用 Map 進行 Select
// User's ID is `001`:
db.Model(&user).Select("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
// UPDATE users SET name='hello' WHERE id=001;
db.Model(&user).Omit("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
// UPDATE users SET age=18, active=false, updated_at='2022-03-04 09:47:10' WHERE id=001;
// 使用 Struct 進行 Select(會 select 零值的字段)
db.Model(&user).Select("Name", "Age").Updates(User{Name: "new_name", Age: 0})
// UPDATE users SET name='new_name', age=0 WHERE id=001;
// Select 所有字段(查詢包括零值字段的所有字段)
db.Model(&user).Select("*").Update(User{Name: "張三", Role: "admin", Age: 0})
// Select 除 Role 外的所有字段(包括零值字段的所有字段)
db.Model(&user).Select("*").Omit("Role").Update(User{Name: "張三", Role: "admin", Age: 0})
GORM允許使用SQL表達式更新列,例如:
// product 的 ID 是 `3`
db.Model(&product).Update("price", gorm.Expr("price * ? + ?", 2, 100))
// UPDATE "products" SET "price" = price * 2 + 100, "updated_at" = '2022-03-04 09:51:10' WHERE "id" = 3;
db.Model(&product).Updates(map[string]interface{}{"price": gorm.Expr("price * ? + ?", 2, 100)})
// UPDATE "products" SET "price" = price * 2 + 100, "updated_at" = '2022-03-04 09:51:10' WHERE "id" = 3;
db.Model(&product).UpdateColumn("quantity", gorm.Expr("quantity - ?", 1))
// UPDATE "products" SET "quantity" = quantity - 1 WHERE "id" = 3;
db.Model(&product).Where("quantity > 1").UpdateColumn("quantity", gorm.Expr("quantity - ?", 1))
// UPDATE "products" SET "quantity" = quantity - 1 WHERE "id" = 3 AND quantity > 1;
更多建議: