更新操作
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会对整张表起作用
更新选定字段
使用Select和Omit选择或忽略某些字段
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})