阅读(1322) (1)

GORM 更新

2022-03-04 09:32:13 更新

保存所有字段

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 方法,且该对象主键有值,该值会被用于构建条件,例如:

// 条件更新
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;

// 根据条件和 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{}参数。当使用struct更新时,默认情况下,GORM只会更新非零值的字段

// 根据 `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;

// 根据 `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只会更新非零字段。如果您想确保指定字段被更新,你应该使用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})

使用SQL表达式更新

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;