Подтвердить что ты не робот

Django 1.6 TransactionManagementError: база данных не работает должным образом, когда автокоммит выключен

Я пытаюсь обновить проект с Django 1.5.5 до Django 1.6, но я везде получаю эту ошибку.

Traceback (most recent call last):

File "project/virtualenv/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response
  response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "project/virtualenv/lib/python2.7/site-packages/django/contrib/admin/sites.py", line 215, in wrapper
  return self.admin_view(view, cacheable)(*args, **kwargs)

File "project/virtualenv/lib/python2.7/site-packages/django/utils/decorators.py", line 99, in _wrapped_view
  response = view_func(request, *args, **kwargs)

File "project/virtualenv/lib/python2.7/site-packages/django/views/decorators/cache.py", line 52, in _wrapped_view_func
  response = view_func(request, *args, **kwargs)

File "project/virtualenv/lib/python2.7/site-packages/django/contrib/admin/sites.py", line 197, in inner
  return self.login(request)

File "project/virtualenv/lib/python2.7/site-packages/django/views/decorators/cache.py", line 52, in _wrapped_view_func
  response = view_func(request, *args, **kwargs)

File "project/virtualenv/lib/python2.7/site-packages/django/contrib/admin/sites.py", line 330, in login
  return login(request, **defaults)

File "project/virtualenv/lib/python2.7/site-packages/django/views/decorators/debug.py", line 75, in sensitive_post_parameters_wrapper
  return view(request, *args, **kwargs)

File "project/virtualenv/lib/python2.7/site-packages/django/utils/decorators.py", line 99, in _wrapped_view
  response = view_func(request, *args, **kwargs)

File "project/virtualenv/lib/python2.7/site-packages/django/views/decorators/cache.py", line 52, in _wrapped_view_func
  response = view_func(request, *args, **kwargs)

File "project/virtualenv/lib/python2.7/site-packages/django/contrib/auth/views.py", line 43, in login
  auth_login(request, form.get_user())

File "project/virtualenv/lib/python2.7/site-packages/django/contrib/auth/__init__.py", line 83, in login
  request.session.cycle_key()

File "project/virtualenv/lib/python2.7/site-packages/django/contrib/sessions/backends/base.py", line 277, in cycle_key
  self.create()

File "project/virtualenv/lib/python2.7/site-packages/django/contrib/sessions/backends/db.py", line 40, in create
  self.save(must_create=True)

File "project/virtualenv/lib/python2.7/site-packages/django/contrib/sessions/backends/db.py", line 62, in save
  with transaction.atomic(using=using):

File "project/virtualenv/lib/python2.7/site-packages/django/db/transaction.py", line 244, in __enter__
  "Your database backend doesn't behave properly when "

TransactionManagementError: Your database backend doesn't behave properly when autocommit is off. Turn it on before using 'atomic'.

Я удалил TransactionMiddleware из MIDDLEWARE_CLASSES и заменил его на ATOMIC_REQUESTS = True. (Такая же ошибка, даже если я этого не делаю)

Кто-нибудь может пролить свет на это?

4b9b3361

Ответ 1

Я столкнулся с этим с sqlite3 db, используя Django 1.6. Вот решения.

  • django.middleware.transaction.TransactionMiddleware устарел. Если у вас нет этого в файле settings.py, вы не должны получать ошибку.

  • Случайно, я обнаружил, что в том числе ATOMIC_REQUESTS: True работает вокруг ошибки, если вы оставили django.middleware.transaction.TransactionMiddleware в своем списке среднего класса.

например.

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': 'sqlite3-db',
    'ATOMIC_REQUESTS': True
  }
}

Ответ 2

У меня была такая же проблема в моей миграции forwards (что интересно, не произошло в моей миграции backwards) и не имеет TransactionMiddleware в моих настройках. Мое обходное решение состояло в том, чтобы избежать использования метода get_or_create и вместо этого сделать то же самое более подробно. Из Django docs:

try:
    obj = Person.objects.get(first_name='John', last_name='Lennon')
except Person.DoesNotExist:
    obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))
    obj.save()

Затем вы можете создать свой собственный метод pseudo- get_or_create следующим образом:

def fake_get_or_create(model, *args, **kwargs):
    try:
        obj = model.objects.get(**kwargs)
    except model.DoesNotExist:
        obj = model(**kwargs)
        obj.save()
    return obj

Что вы можете использовать, выполнив следующие

obj = fake_get_or_create(Person, first_name='John', last_name='Lennon')

Ответ 3

Я столкнулся с той же проблемой при использовании sqlite3. Я узнал, что использовал transaction.commit_on_success. При изменении этого параметра на transaction.atomic() проблема была решена.

Ответ 4

добавьте их в свои миграции

def forwards(self, orm):
    if connection.vendor == 'sqlite':
        set_autocommit(True)

и он установит для автоматического переноса значение true для переноса:)

Ответ 5

Я считаю, что ошибка связана с ограничениями Sqlite3. Чтобы решить эту проблему, мне пришлось переключиться с Sqlite3 на более надежный механизм базы данных, например postgrsql_psycopg2.

Код, выдающий ошибку (transaction.py:244), дает ключ в комментарии:

        if not connection.get_autocommit():
            # Some database adapters (namely sqlite3) don't handle
            # transactions and savepoints properly when autocommit is off.
            # Turning autocommit back on isn't an option; it would trigger
            # a premature commit. Give up if that happens.
            if connection.features.autocommits_when_autocommit_is_off:
                raise TransactionManagementError(
                    "Your database backend doesn't behave properly when "
                    "autocommit is off. Turn it on before using 'atomic'.")

Взгляд на самую последнюю Южную Документацию (0.8.4) проливает больше света на проблемы с Sqlite3: http://south.readthedocs.org/en/latest/databaseapi.html#database-specific-issues

SQLite не поддерживает много изменений схемы вообще, но у Юга есть обходные пути, позволяющие удалять/изменять столбцы. Однако уникальные индексы остаются неподдерживаемыми; Юг молча игнорирует любые такие команды.

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