Python Django回滚不';行不通
使用Django1.4.22和“自动提交”默认值为True。由于无法更改默认值,如何临时关闭它以便使用回滚。 背景:我正在编写一个数据库数据删除脚本,我想在真的删除它之前测试一下它是否有效。所以我使用dry_run测试它是否被删除,然后回滚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()
@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')
来解决这个问题,现在就开始吧。非常感谢你!