gpt4 book ai didi

python - Django、Postgresql 和 IntegrityErrors

转载 作者:太空宇宙 更新时间:2023-11-03 12:50:53 26 4
gpt4 key购买 nike

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

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

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

如果说,在第 5 次循环中发生 IntegrityError,哪些对象将被插入到数据库中?

最佳答案

这取决于您如何管理交易。

在 Postgres 上,如果事务中的一个查询失败,所有后续查询也将失败,并出现错误“当前事务中止,查询被忽略,直到事务 block 结束”。

要处理它,您应该在 except block 中使用 transaction.savepoint_rollback。

请引用 Django 文档 Handling 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

关于python - Django、Postgresql 和 IntegrityErrors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8183700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com