使用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)