个人认为GORM在更新操作中最大的亮点在于,可以只更新 struct
中非零的字段
也就是说,可以根据传入的RAW对象来直接更新数据
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 = '2013-11-17 21:34:10' WHERE id = 111;
// 根据 `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='2013-11-17 21:34:10' WHERE id=111;
sql.go
func UpdateUser(user dao.User) (int, string, dao.User) {
result := dao.GormDB.Table("user").Updates(user)
if result.Error != nil {
return 4000, result.Error.Error(), dao.User{}
}
result = dao.GormDB.Table("user").First(&user, user.ID)
if result.Error != nil {
return 4000, result.Error.Error(), dao.User{}
}
return 5000, "success", user
}
api.go
func UpdateUser(c *gin.Context) {
jsonData, _ := c.GetRawData()
var user dao.User
_ = json.Unmarshal(jsonData, &user) // 将获取到的raw数据反序列化成对应的实体类
code, msg, data := sql.UpdateUser(user)
if code == 4000 {
c.JSON(http.StatusBadRequest, gin.H{
"code": code,
"msg": msg,
"status": "failed",
})
} else if code == 5000 {
c.JSON(http.StatusOK, gin.H{
"code": code,
"msg": msg,
"status": "ok",
"data": data,
})
}
}
postman测试