Python Django回滚不';行不通

Python Django回滚不';行不通,python,django,Python,Django,使用Django1.4.22和“自动提交”默认值为True。由于无法更改默认值,如何临时关闭它以便使用回滚。 背景:我正在编写一个数据库数据删除脚本,我想在真的删除它之前测试一下它是否有效。所以我使用dry_run测试它是否被删除,然后回滚 @transaction.commit_manually def run(self, dry_run): try: assert self.database in self.validate_values.keys()

使用Django1.4.22和“自动提交”默认值为True。由于无法更改默认值,如何临时关闭它以便使用回滚。 背景:我正在编写一个数据库数据删除脚本,我想在真的删除它之前测试一下它是否有效。所以我使用dry_run测试它是否被删除,然后回滚

@transaction.commit_manually
def run(self, dry_run):
    try:
        assert self.database in self.validate_values.keys()
        assert self.table in self.validate_values.values()
    except AssertionError as e:
        logger.error("%s or %s is not available. \n Error: %s" % (self.database, self.table, e.message))
        return

    self.cursor.execute(self.SELECT_PATTERN % self.PGDict)
    current_value = self.cursor.fetchall()

    if len(current_value) > 1:
        logger.error("You can only update one item at a time.\n Current value: %s" % current_value)
        return

    elif len(current_value) == 0:
        logger.error("No data.")
        return

    elif len(current_value) == 1:
        if dry_run:
            logger.warning("Data below will be deleted.\n")
            logger.info("Current value: %s" % current_value)

            transaction.savepoint()

            try:
                print current_value
                self.cursor.execute(self.DELETE_PATTERN % self.PGDict)
                self.cursor.execute(self.SELECT_PATTERN % self.PGDict)
                current_value = self.cursor.fetchall()
                assert len(current_value) == 0

                transaction.rollback()

                logger.info("Dry run successfully.")

                self.cursor.execute(self.SELECT_PATTERN % self.PGDict)

                current_value = self.cursor.fetchall()
                print current_value
                return current_value
            except AssertionError as e:
                logger.error("Dry run failed. \n Error: %s" % e.message)
                return

        else:
            logger.warning("Data deleting...\n")

            self.cursor.execute(self.DELETE_PATTERN % self.PGDict)
            self.cursor.execute(self.SELECT_PATTERN % self.PGDict)
            current_value = self.cursor.fetchall()

            try:
                assert len(current_value) == 0
                logger.info("Done.")
                return len(current_value)
            except AssertionError as e:
                logger.error("Deletion failed. \n Error: %s" % e.message)
                return

    else:
        logger.error("Value Error")
        return
测试如下:

    def test_run_dry_run(self):
        actual = self.toolkit.run(dry_run=True)
        self.assertEqual(len(actual), 1)
        self.assertEqual(actual[0][0], 123456)

“回滚不起作用”不是一个非常具体的错误。因为您使用的是Django的旧版本,所以要提供帮助尤其困难。Django 1.4已经过时多年了,事务API在Django 1.5中进行了彻底的修改。@Alasdair谢谢!我删除了transaction.rollback()并调用了transaction.savepoint\u rollback(sid),看起来它确实回滚了,但实际上没有,我不知道为什么。我在删除之前创建了一个保存点,它应该回滚到我没有删除的地方,对吗?但只要我再次查询数据,它就已经被删除了。出现了一个错误:TransactionManagementError:事务管理块以挂起的提交/回滚结束。@Alasdair现在我可以回滚到它应该在的位置了!谢谢,但仍然有一个错误:TransactionManagementError:事务管理块以挂起的提交/回滚结束,我似乎无法修复它。正如错误消息所示,您需要调用
Transaction.COMMIT()
Transaction.ROLLBACK()
在视图返回之前提交或回滚事务。@Alasdair我添加了
如果事务.is\u dirty(使用class='aa\u assets'):transaction.set\u clean(使用class='aa\u assets')
来解决这个问题,现在就开始吧。非常感谢你!