无法在使用Django ORM的脚本中关闭自动提交

3 投票
1 回答
1948 浏览
提问于 2025-04-15 20:35

我有一个命令行脚本,它使用了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)运行。

撰写回答