Django ORM без HTTP и коммитера commit_on_success - PullRequest
0 голосов
/ 05 марта 2010

Я пытаюсь использовать ORM Джанго в моей не-HTTP части проекта.

В одной функции мне нужно делать массовые вставки данных, поэтому мне нужен декоратор commit_on_success.

Но я обнаружил, что этот декоратор не выполняет то, что предполагалось (не откат транзакции при ошибке).

Я зашел в этот декоратор с отладчиком, но я нашел причину в этом коде:

if is_dirty():
    rollback()

Если грязные всегда возвращают истину, поэтому Джанго считал, что транзакция всегда чистая.

И я получаю «InternalError: текущая транзакция прервана, команды игнорируются до конца блока транзакции»

Что я могу сделать с этой проблемой?

1 Ответ

1 голос
/ 05 марта 2010

В декораторе работает форма.

is_dirty, будучи истинным, звучит так, как будто запрос ... грязный (было бы логично выполнить откат, только если он грязный).

Следовательно, откат, кажется, происходит каждый раз. Ваша база данных поддерживает транзакции (например, не таблицы myIsam)? Делаете ли вы какие-либо commit () в вашем методе? Если да, то, конечно, его нельзя откатить.

Конечно, вы можете сделать это вручную, выдав коммит в конце массового импорта (или, что еще лучше, каждый блок из N значений вставляется + 1 в конце, если вы не возражаете против того, чтобы ваши данные были частично импортированы ) и завернуть весь блок в

try : 
  do_whatever_inserts
except : 
  db.rollback()
  raise
else : 
  db.commit()
...