代码之家  ›  专栏  ›  技术社区  ›  Wes

无法在使用django orm的脚本中关闭自动提交

  •  3
  • Wes  · 技术社区  · 15 年前

    我有一个使用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')
    

    我还尝试将insert放在函数中并手动添加django的commit_包装器,如下所示:

    @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 回复  |  直到 15 年前
        1
  •  2
  •   Daniel Roseman    15 年前

    你的桌子是myisam还是innodb?记住myisam不是事务性的,所以不能回滚。例如,请参见 this page 在mysql文档中:

    在事务性方面,myisam表总是有效地以autocommit=1模式运行。