2010-10-05 102 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 

我不知道如何解決這個問題。