我来自一个mysql后台,如果我想插入一个记录,我可以使用insert ignore命令,这样我就可以插入行,如果有冲突,就忽略它。
现在,对于我正在处理的Django项目,我正在使用postgresql,并在一个循环中发出多个保存但是,我认为如果我得到一个integriterror(我忽略了它,请参阅下面的代码),那么我将丢失大量要插入的对象。我该如何解决这个问题:
for thing in things:
try:
#potentially dangerous save..
obj = Thing(stuff=10)
obj.save()
except IntegrityError:
pass
如果说,在第5个循环中发生整数错误,那么哪些对象将被插入到数据库中?
最佳答案
这将取决于你如何管理你的交易。
在postgres上,如果事务中的查询之一失败,则所有后续查询也将失败,并出现错误“当前事务已中止,查询将被忽略,直到事务块结束”。
要处理它,应该在except块中使用transaction.savepoint_rollback。
请参阅django docHandling exceptions within PostgreSQL transactions
它给出了下一个例子
a.save() # Succeeds, and never undone by savepoint rollback
try:
sid = transaction.savepoint()
b.save() # Could throw exception
transaction.savepoint_commit(sid)
except IntegrityError:
transaction.savepoint_rollback(sid)
c.save() # Succeeds, and a.save() is never undone