我来自一个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

10-07 13:18
查看更多