个人认为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测试
