官方文档
    更新

    个人认为GORM在更新操作中最大的亮点在于,可以只更新 struct中非零的字段
    也就是说,可以根据传入的RAW对象来直接更新数据

    Updates 方法支持 struct 和 map[string]interface{} 参数。当使用 struct 更新时,默认情况下,GORM 只会更新非零值的字段

    1. // 根据 `struct` 更新属性,只会更新非零值的字段
    2. db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false})
    3. // UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 21:34:10' WHERE id = 111;
    4. // 根据 `map` 更新属性
    5. db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
    6. // UPDATE users SET name='hello', age=18, active=false, updated_at='2013-11-17 21:34:10' WHERE id=111;

    sql.go

    1. func UpdateUser(user dao.User) (int, string, dao.User) {
    2. result := dao.GormDB.Table("user").Updates(user)
    3. if result.Error != nil {
    4. return 4000, result.Error.Error(), dao.User{}
    5. }
    6. result = dao.GormDB.Table("user").First(&user, user.ID)
    7. if result.Error != nil {
    8. return 4000, result.Error.Error(), dao.User{}
    9. }
    10. return 5000, "success", user
    11. }

    api.go

    1. func UpdateUser(c *gin.Context) {
    2. jsonData, _ := c.GetRawData()
    3. var user dao.User
    4. _ = json.Unmarshal(jsonData, &user) // 将获取到的raw数据反序列化成对应的实体类
    5. code, msg, data := sql.UpdateUser(user)
    6. if code == 4000 {
    7. c.JSON(http.StatusBadRequest, gin.H{
    8. "code": code,
    9. "msg": msg,
    10. "status": "failed",
    11. })
    12. } else if code == 5000 {
    13. c.JSON(http.StatusOK, gin.H{
    14. "code": code,
    15. "msg": msg,
    16. "status": "ok",
    17. "data": data,
    18. })
    19. }
    20. }

    postman测试
    image.png