Django回滚并不起作用

时间:2018-05-17 08:45:49

标签: python django

使用Django1.4.22和' autocommit'默认为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)

0 个答案:

没有答案