У меня есть кусок кода, который работает в фоновом режиме, который выглядит как
from django.db import transaction
try:
<some code>
transaction.commit()
except Exception, e:
print e
transaction.rollback()
В тесте я ломаю <some_code>
с данными, которые вызывают ошибку базы данных. Исключение составляет
File "/home/commando/Development/Diploma/streaminatr/stream/testcases/feeds.py", line 261, in testInterrupt
form.save(self.user1)
File "/usr/lib/pymodules/python2.5/django/db/transaction.py", line 223, in _autocommit
return func(*args, **kw)
File "/home/commando/Development/Diploma/streaminatr/stream/forms.py", line 99, in save
print(models.FeedChannel.objects.all())
File "/usr/lib/pymodules/python2.5/django/db/models/query.py", line 68, in `__repr__ `
data = list(self[:REPR_OUTPUT_SIZE + 1])
File "/usr/lib/pymodules/python2.5/django/db/models/query.py", line 83, in `__len__ `
self._result_cache.extend(list(self._iter))
File "/usr/lib/pymodules/python2.5/django/db/models/query.py", line 238, in iterator
for row in self.query.results_iter():
File "/usr/lib/pymodules/python2.5/django/db/models/sql/query.py", line 287, in results_iter
for rows in self.execute_sql(MULTI):
File "/usr/lib/pymodules/python2.5/django/db/models/sql/query.py", line 2369, in execute_sql
cursor.execute(sql, params)
InternalError: current transaction is aborted, commands ignored until end of transaction block
Это то, что я ожидаю. Плохо то, что я все еще получаю ту же ошибку при попытке получить доступ к БД после вызова transaction.rollback
. Что мне нужно сделать, чтобы успешно откатить транзакцию и снова установить соединение?
Кстати, я также попытался вставить print connection.queries
для отладки кода, и он всегда возвращает пустой список. Может ли быть так, что Django использует какое-то другое соединение с БД?
Код выполняется вне цикла запрос-ответ. Я попытался включить и выключить TransactionMiddleware, но это не дало эффекта.
Я использую Django 1.1 и Postgres 8.4.