mysql - IntegrityError 与 Django m2m 关系

标签 mysql django mysql-error-1062 m2m

我有一个相对简单的 Django 应用程序,使用率很高,它负责数据库操作中的一些并发性。

我有一个带有 m2m 到 Tag 模型的 Post 模型。

我的代码中有一行 p.add(t) 反复导致 mysql 异常(其中 p 是一个 Post 实例,t 是一个 Tag 实例。)

IntegrityError: (1062, "Duplicate entry '329051-1827414' for key 'post_id'")

引发此问题时,我可以成功手动运行此 p.add(t),因此它必须与正常执行时 db/app 所处的某些特殊状态有关.它大约每 1000 次添加标签尝试发生一次,没有任何我可以检测到的模式(即示例中“329051-1827414”对中的两个数字都发生了变化)

相关表在mysql中的一个CHECK TABLE显示它们看起来都OK。

有什么想法吗?

最佳答案

如果要添加的行与 FK 的 unique-together 约束重复,那么在尝试添加到中间表时,您通常会看到类似这样的错误。我猜想在您提供的示例中,“329051”是一个帖子 ID,“1827414”是一个标签 ID。

通常在 Django 中,您可以重复调用 add() 方法来添加相同的实例,Django 会为您处理所有事情。我假设模型管理器维护一些状态来帮助它确定每个 add() 是否代表一个新的或现有的行,如果该行看起来是新的,它会尝试插入。

这本身并不能解释为什么会出现错误。您提到“负责数据库操作中的相当多的并发性”。在不知道这意味着什么的情况下,我猜你可能会遇到一个竞争条件,其中多个线程/进程试图在大约同一时间添加相同的新标签并且都在尝试插入。

关于mysql - IntegrityError 与 Django m2m 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3866834/

相关文章:

mysql - MyISAM 唯一键在 64 字节处被截断,导致冲突

mysql - 使用 username=email 保存用户时出现 IntegrityError

mysql - Eloquent 模型未按正确的顺序连接表

mysql - 尝试创建数据库时出现权限问题

python - 序列化 Django 模型对象 : Referencing to self

python - 如何在 django 上为 Ext.data.TreeStore 的选定值正确创建响应

mysql - 如何在mysql中保存一棵树?

mysql - 为什么MySQL返回null 1000/0

python - 通过渲染变量的中间来修改django模板中的变量