gorm map更新操作时忽略数据库没有的字段
时间: 2023-07-28 15:13:37 浏览: 69
在 GORM 中,使用 `Updates` 函数可以对一个记录进行更新操作,同时只更新传入的字段。如果传入的字段在数据库中不存在,则会在更新时报错。为了忽略掉这些不存在的字段,可以使用 `map[string]interface{}` 类型来传递需要更新的字段,然后使用 `Select` 函数来选取数据库中存在的字段,再进行更新操作。
以下是一个示例代码:
```go
type User struct {
ID uint `gorm:"primaryKey"`
Name string
Email string
}
// 更新用户信息
func updateUser(db *gorm.DB, userID uint, updates map[string]interface{}) error {
// 查询该用户是否存在
var user User
if err := db.First(&user, userID).Error; err != nil {
return fmt.Errorf("failed to find user: %w", err)
}
// 选取需要更新的字段
var selectedUpdates = make(map[string]interface{})
for key, value := range updates {
switch key {
case "Name":
selectedUpdates[key] = value
case "Email":
selectedUpdates[key] = value
}
}
// 更新用户信息
if err := db.Model(&user).Select(selectedUpdates).Updates(selectedUpdates).Error; err != nil {
return fmt.Errorf("failed to update user: %w", err)
}
return nil
}
```
在上面的代码中,`updates` 参数是一个字符串到任意类型的映射,表示需要更新的字段及其新的值。在选取需要更新的字段时,我们只选择了 `Name` 和 `Email` 两个字段,如果 `updates` 中包含其他字段,则会被忽略掉。最后,我们使用 `Select` 函数选取了数据库中存在的字段,再用 `Updates` 函数进行更新操作。