GORM 更新记录
GORM 提供多种更新方法,用于修改单条记录的部分或全部字段。
定义
Save 更新全部字段(含零值),Update 更新单个字段,Updates 更新多个字段(忽略零值)。
语法
Go
func (db *DB) Save(value interface{}) (tx *DB)
func (db *DB) Update(column string, value interface{}) (tx *DB)
func (db *DB) Updates(values interface{}, conds ...interface{}) (tx *DB)
示例
Save 方法
Go
user.Name = "新名字"
user.Age = 30
db.Save(&user)
// UPDATE users SET name='新名字', age=30, updated_at=... WHERE id=1
Update 方法(单字段)
Go
// 更新单个字段
db.Model(&user).Update("name", "新名字")
// 使用 Column 表达式
db.Model(&user).Update("age", gorm.Expr("age + ?", 1)) // age = age + 1
Updates 方法(多字段)
Go
// 使用 map
db.Model(&user).Updates(map[string]interface{}{
"name": "新名字",
"age": 30,
})
// 使用结构体(仅更新非零值字段)
db.Model(&user).Updates(User{Name: "新名字", Age: 30})
更新选中的零值字段
Go
// 显式指定更新零值字段
db.Model(&user).Select("name", "age", "updated_at").Updates(user)
// 排除字段
db.Model(&user).Omit("updated_at").Updates(user)
条件更新
Go
db.Model(&User{}).Where("active = ?", true).Updates(map[string]interface{}{
"status": "inactive",
})
Save、Update、Updates 区别
| 方法 | 更新范围 | 零值处理 | 适用场景 |
|---|---|---|---|
| Save | 全部字段 | 更新零值 | 完整覆盖更新 |
| Update | 单个字段 | 更新零值 | 修改单个字段 |
| Updates | 多个字段 | 忽略零值字段 | 批量修改非零值字段 |
注意事项
Save会更新所有字段包括零值,UpdatedAt自动更新Updates使用结构体时,零值字段(如Age: 0)不会被更新,需用 map 或SelectUpdate和Updates需要配合Model指定主键条件,否则会更新全表gorm.Expr用于构建数据库表达式,实现字段自增等操作- 更新操作返回
RowsAffected为 0 表示未匹配到记录
要点总结
Save更新全部字段含零值,Update改单字段,Updates改多字段Updates结构体忽略零值,map 包含零值- 零值字段更新需用
Select显式指定 - 条件更新需配合
Model或Where避免全表更新 UpdatedAt字段在每次更新时自动变更
📝 发现内容有误?点击此处直接编辑