IntegrityError с отношениями Django m2m - PullRequest
1 голос
/ 05 октября 2010

У меня есть относительно простое приложение Django, с довольно интенсивным использованием, которое отвечает за некоторый параллелизм в операциях с db.

У меня есть модельный пост с м2м до метки модели.

Одна строка в моем коде 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» примера меняются)

A CHECK TABLE в mysql на соответствующей таблице показывает, что все они вроде бы в порядке.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 06 октября 2010

Обычно такие ошибки появляются при попытке добавить в промежуточную таблицу, если добавляемая строка дублирует ограничение уникальности для FK.Я предполагаю, что в приведенном вами примере «329051» является идентификатором поста, а «1827414» является идентификатором тега.

Обычно в Django вы можете вызывать метод add () несколько раз, чтобы добавить один и тот же экземпляр, и Django позаботится обо всем за вас.Я предполагаю, что менеджер модели поддерживает некоторое состояние, чтобы помочь ему определить, представляет ли каждый add () новую или существующую строку, и если строка кажется новой, она пытается вставить.

Это само по себе не объясняет, почему вы получаете ошибку.Вы упомянули «ответственен за некоторый параллелизм в операциях с БД».Не зная, что это значит, я предполагаю, что вы можете получить состояние гонки, когда несколько потоков / процессов пытаются добавить один и тот же новый тег в одно и то же время, и оба пытаются вставить.

0 голосов
/ 30 мая 2014

Я думаю, что вижу похожую проблему в своем приложении - если я отправляю два одинаковых запроса на добавление отношения m2m (например, тега в моем случае), я получаю эту ошибку, потому что таблица m2m имеет уникальное ограничение на (пользователь, тег). Я предполагаю, что сервер обрабатывает функции .add в то же время .

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

Я не знаю, как это можно исправить.

...