2010-10-05 74 views
1

我有一个比较简单的Django应用程序,有相当大量使用,它负责在数据库中操作相当长的一段并发。IntegrityError Django的M2M关系

我有一个M2M标签模型的模型后。

在我的一行代码,p.add(t)反复导致MySQL的例外(其中p是一个后实例,t是一个标签实例。)

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

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

A CHECK TABLE在mysql的相关表显示它们都看起来不错。

任何想法?

回答

1

通常试图添加到一个中间表,如果被添加的行复制为FK的独特在一起的约束,当你看到这样的错误。我猜你在提供“329051”的例子中是Post ID,“1827414”是Tag ID。

通常在Django可以反复调用add()方法添加相同的实例和Django的照顾一切的为您服务。我假设模型管理器维护一些状态来帮助它确定每个add()代表一个新的或现有的行,并且如果该行看起来是新的,它将尝试插入。

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

0

我想我在我的应用程序中看到类似的问题 - 如果我发送两个相同的请求来添加一个m2m关系(例如,标签在我的情况下),我得到该错误,因为m2m表具有唯一约束(用户,标签)。我猜的服务器在同一时间处理。新增功能

if not already in database: 
    # Both invocations reach here because the next line takes some time to process. 
    create m2m row 

我不知道如何解决这个问题。