无法在使用Django ORM的脚本中关闭自动提交
我有一个命令行脚本,它使用了Django的ORM和MySQL数据库。我想关闭自动提交功能,手动进行提交。但是我就是搞不定。下面是这个脚本的简化版本。每次我运行这个脚本时,都会往testtable表里插入一行数据,而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')
我还尝试把插入操作放在一个函数里,并加上Django的commit_manually包装器,像这样:
@transaction.commit_manually
def myfunction():
cursor = connection.cursor()
cursor.execute('SET autocommit = 0')
cursor.execute('insert into westest values (\'X\')')
cursor.execute('rollback')
myfunction()
我还试着在settings.py里设置DISABLE_TRANSACTION_MANAGEMENT = True,但还是没有成功。我觉得我可能漏掉了什么明显的东西。非常感谢你能给我的任何帮助!谢谢!
1 个回答
2
你的数据库表是MyISAM还是InnoDB?要记住,MyISAM不支持事务,也就是说一旦发生错误,就不能撤销之前的操作。比如,你可以查看MySQL文档中的这一页:
从事务的角度来看,MyISAM表实际上总是以自动提交模式(autocommit = 1)运行。