【问题标题】:Update a record with nested objects giving duplicate key error使用嵌套对象更新记录,给出重复键错误
【发布时间】:2021-05-21 06:26:27
【问题描述】:

我需要更新用户配置文件,我正在获取整个配置文件,允许用户编辑他想要的内容,然后将整个配置文件再次发送到服务器以保存更新的任何值,但它不起作用。

User {
   Address {
       Country {
             // fields
        },
    // fields
   },

  Settings { 
    // fields
   },

  username: string, 
  email: string,
}

为避免复杂化,我想发送整个记录,全部保存,更新任何已更新的内容或为未更新的字段再次保存旧值。

我试过这个:

// Update User data
func (r *RepositoryUserCrud) Update(uid int, user models.User) (int, error) {
    var err error

// 1, did not work, getting  Error 1062: Duplicate entry for email
 err = r.db.Debug().Model(&models.User{}).Where("id = ?", unit(uid)).Updates(user).Error

// 2, did not work, getting  Error 1062: Duplicate entry for email
 err = r.db.Save(&user).Error;

// 3, I tried to skip the duplicate key error by using {onConflict: DoNothing}
err = r.db.Debug().Clauses(r.db.Model(&models.User{})
                  .Where("id = ?", uint(uid)))
                  .OnConflict{DoNothing: true}
                  .Updates(user)
}

关于如何进行这项工作的任何建议?

如果深度嵌套的对象发生了变化,如何将这些变化应用到它们的表中?还是我应该手动执行此操作?

【问题讨论】:

  • 你为什么把你所有的go代码sn-ps都标记为js??
  • 它给出错误 1062:电子邮件的重复条目,例如尝试输入新记录而不更新现有记录
  • 确保您没有尝试将电子邮件更新为表中已存在的电子邮件。并确保您要更新的每个子实体都有一个 ID。

标签: mysql go crud go-gorm


【解决方案1】:

原来 email 字段是主键,我没有将 ID 作为更新记录的一部分传递,所以它基本上是在尝试使用相同的电子邮件创建新记录。

所以此代码有效,但请确保向ID 提供记录本身。

err = r.db.Debug().Model(&models.User{}).Where("id = ?", unit(uid)).Updates(user).Error

我还需要手动更新其他表中的链接行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-12
    • 2018-11-07
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    相关资源
    最近更新 更多