Django,Postgresql和IntegrityErrors

Stu*_*art 3 python django postgresql

我来自一个mysql背景,如果我想插入一个记录,我可以使用INSERT IGNORE命令,这样我就可以打开行,如果有冲突就忽略它.

现在,我正在使用Django项目,我正在使用postgresql,并在循环中发出多个保存.但是,我如果我得到一个IntegrityError(我忽略了,请参阅下面的代码)然后我丢失了我试图插入的大量对象..我应该如何解决这个问题:

for thing in things:
    try:
        #potentially dangerous save..
        obj = Thing(stuff=10)
        obj.save()
    except IntegrityError:
        pass
Run Code Online (Sandbox Code Playgroud)

如果说,在5日绕过循环,会发生IntegrityError,哪些对象会插入到DB中?

Igo*_*gor 8

这取决于您如何管理您的交易.

在Postgres上,如果事务中的一个查询失败,则所有后续查询也将失败并显示错误"当前事务被中止,查询被忽略直到事务块结束".

要处理它,你应该在except块中使用transaction.savepoint_rollback.

请参阅Django doc 处理PostgreSQL事务中的异常

它给出了下一个例子

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
Run Code Online (Sandbox Code Playgroud)