我想使用MySQLdb在我的django项目中创建一个回滚按钮。我试图使用InnoDB的commit()和rollback()作为数据库引擎,rollback()似乎不起作用,因为即使在commit()之后放置了rollback(),数据库也会更新。以下是python代码中的一些相关行:
def update(request):
if 'weight' in request.GET and request.GET['weight']:
weight = request.GET['weight']
else:
return HttpResponseRedirect('/clamplift/')
if 'realtag' in request.GET and request.GET['realtag']:
realtag = request.GET['realtag']
else:
return HttpResponseRedirect('/clamplift/')
conn = MySQLdb.Connect(host="localhost", user="root", passwd="", db="scale")
cur = conn.cursor()
cur.execute("UPDATE `scale`.`scale_stock` SET `current_weight` = %s WHERE `scale_stock`.`paper_roll_id` = %s", (weight,realtag))
conn.commit()
conn.rollback() # I test rollback() function here.
cur.close()
conn.close()
return HttpResponseRedirect('/clamplift/')
实际上我想要一个按钮用于更新数据到数据库,另一个按钮用于回滚,比如提供撤销功能。
请给我任何想法。非常感谢你。
答案 0 :(得分:1)
我没有直接使用MySQLdb的经验,但大多数情况下,rollback
方法只适用于交易。也就是说,如果事务仍处于打开状态,则回滚将撤消自事务开始以来发生的所有事务。因此,当您致电commit
时,您正在结束交易,无法再有意义地致电rollback
。
回应评论中的问题:
在模型中添加日期时间字段以跟踪修订。使用与原始模型相同的字段创建另一个模型,并将外键创建到原始模型的表中。当原始模型发生更新时,将旧值复制到新表中,将datetime设置为NOW,并在执行更新之前将revisions表中的外键设置为指向正在编辑的行。然后,您可以通过选择相关行的所有修订并让用户根据日期时间进行选择来提供要还原的先前状态列表。当然,您也可以提供进行编辑的用户或您认为对您的应用用户有用的其他特定信息。