Потоковое приложение + IntegrityError - PullRequest
1 голос
/ 31 июля 2009

У меня есть потоковое приложение на Python + Postgres. Я использую ORM Джанго сохранить в Postgres ..
У меня есть одновременные вызовы сохранения. Иногда 2 темы сохраняются с тот же первичный ключ, который приводит к проблеме.

Журнал Postgres:
ОШИБКА: двойное значение ключа нарушает уникальное ограничение "store_pkey"
ЗАЯВЛЕНИЕ: INSERT INTO "store" ("store_id", "address") ЗНАЧЕНИЯ (E'HAN277 ', E'101 Ocean Street')

Код:
В коде я вижу IntegrityError. Я пробовал разные способы справиться этот.

а.
попробовать:
a.save ()
кроме IntegrityError:
пропуск

Это вызывает InternalError

б. Пытался сделать откат транзакции .. но не уверен .. Насколько я понимаю, что вам нужно различать вызовы сохранения, чтобы иметь транзакции

      sid = transaction.savepoint()
      try:
        row.save()
      except IntegrityError, e:
        transaction.savepoint_rollback(sid)
        pass
      transaction.commit()

Первая точка сохранения завершается с ошибкой

AttributeError: объект 'NoneType' не имеет атрибута 'cursor'

а. Я читал где-то Django не является 100% потокобезопасным. Это хорошо выбор в моем случае. Я уже использовал Django для другого приложения и нужна ORM .. Поэтому, естественно, я выбрал Django
б. Как справиться с этой ситуацией .. Любые комментарии.

Спасибо и всего наилучшего, Рамя

1 Ответ

2 голосов
/ 31 июля 2009

Просто чтобы убедиться, что вы используете строки для первичных ключей, если я правильно понимаю?

AttributeError: объект NoneType не имеет атрибута «курсор»

Это означает, что в некотором коде Python есть ошибка. Вы пытались использовать другую версию или ревизию Django или искали в треке Django свою ошибку? Если вы используете версию из trunk, это не редкость, когда на вас влияет какая-то ошибка.

В качестве альтернативы вы можете также попытаться развернуть Django, используя несколько процессов вместо нескольких потоков, если это возможно.

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

...