Невозможно отключить автокоммит в скрипте, используя Django ORM - PullRequest
3 голосов
/ 18 марта 2010

У меня есть сценарий командной строки, использующий бэкэнд Django ORM и MySQL. Я хочу отключить автокоммит и зафиксировать вручную. На всю жизнь я не могу заставить это работать. Вот урезанная версия скрипта. Строка вставляется в тестовую таблицу каждый раз, когда я запускаю это, и я получаю предупреждение от MySQL: «Некоторые нетранзакционные измененные таблицы не удалось откатить».

#!/usr/bin/python

import os
import sys

django_dir = os.path.abspath(os.path.normpath(os.path.join(os.path.dirname(__file__), '..')))
sys.path.append(django_dir)

os.environ['DJANGO_DIR'] = django_dir
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'

from django.core.management import setup_environ
from myproject import settings

setup_environ(settings)

from django.db import transaction, connection
cursor = connection.cursor()
cursor.execute('SET autocommit = 0')
cursor.execute('insert into testtable values (\'X\')')
cursor.execute('rollback')

Я также попытался поместить вставку в функцию и добавить оболочку commit_manually в Django, вот так:

@transaction.commit_manually
def myfunction():
    cursor = connection.cursor()
    cursor.execute('SET autocommit = 0')
    cursor.execute('insert into westest values (\'X\')')
    cursor.execute('rollback')

myfunction()

Я также попытался установить DISABLE_TRANSACTION_MANAGEMENT = True в settings.py, но безуспешно. Я чувствую, что упускаю что-то очевидное. Любая помощь, которую вы можете оказать мне, очень ценится. Спасибо!

1 Ответ

2 голосов
/ 18 марта 2010

Ваши таблицы MyISAM или InnoDB? Помните, что MyISAM не является транзакционным, поэтому его нельзя откатить. См. Например эту страницу в документации MySQL:

В терминах транзакций таблицы MyISAM эффективно всегда работают в режиме autocommit = 1.

...