红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【GORM】更新操作

更新操作

Save

使用db.Save(),将这之前修改过的值保存下来

1
2
3
4
5
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;

注意:保存的是所有字段,包括没更新的,包括零值

save方法会根据主键状态来判断是update还是insert:

  • 当有非零主键时,先update更新字段
  • 如果update后影响行数为0,说明不存在,回退执行insert
  • 如果没有主键值,直接执行insert

db.Model()db.Save()混用会导致未定义行为

Update

update一次更新一列,需要指定Model或Table来指定操作的目标表和条件,假设传入的model指定了主键id

更新单个字段:db.Update

1
2
db.Model(&user).Update("name", "jinzhu")
// UPDATE users SET name='jinzhu', updated_at='...' WHERE id = 111;

更新多个字段:db.Updates

1
2
db.Model(&user).Updates(User{Name: "hello", Age: 18})
// UPDATE users SET name='hello', age=18, updated_at='...' WHERE id = 111;

update更新时零值会被忽略,如果想要更新成零值:

使用Select

1
db.Model(&user).Select("Age").Updates(User{Age: 0, Name: "hello"})

使用map

1
db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 0})

若没有Model或Where限定条件,Update会对整张表起作用

更新选定字段

使用SelectOmit选择或忽略某些字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 选择 Map 的字段
// User 的 ID 是 `111`:
db.Model(&user).Select("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
// UPDATE users SET name='hello' WHERE id=111;

db.Model(&user).Omit("name").Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
// UPDATE users SET age=18, active=false, updated_at='2013-11-17 21:34:10' WHERE id=111;

// 选择 Struct 的字段(会选中零值的字段)
db.Model(&user).Select("Name", "Age").Updates(User{Name: "new_name", Age: 0})
// UPDATE users SET name='new_name', age=0 WHERE id=111;

// 选择所有字段(选择包括零值字段的所有字段)
db.Model(&user).Select("*").Updates(User{Name: "jinzhu", Role: "admin", Age: 0})

// 选择除 Role 外的所有字段(包括零值字段的所有字段)
db.Model(&user).Select("*").Omit("Role").Updates(User{Name: "jinzhu", Role: "admin", Age: 0})