我使用 PostgreSQL 作为 psycopg2 的后端,我注意到一些对我来说似乎很奇怪的东西。我的设置如下:
class ParentModel(models.Model):
field1 = models.IntegerField()
class ChildModel(ParentModel):
field2 = models.IntegerField(unique=True)
当我尝试从 shell 中保存具有重复字段 2 的 ChildModel 对象时,我得到的是 InternalError 而不是 IntegrityError,但前提是保存是在 transaction.commit_on_success 块中完成的,如下所示:
with transaction.commit_on_success():
newObj = ChildModel(field1=5, field2=10) # Assume that a ChildModel with field2 == 10 exists
正如我所料,在事务块之外,我得到了一个 IntegrityError。
在视图代码中运行时,即使使用保存点,我也总是在更新失败后收到 InternalError:
try:
sid = transaction.savepoint()
newObj = ChildModel(field1=5, field2=10) # Assume that a ChildModel with field2 == 10 exists
transaction.savepoint_commit(sid)
except IntegrityError:
transaction.savepoint_rollback(sid)
except InternalError:
transaction.savepoint_rollback(sid)
... other stuff ... # raises InternalError on next database hit
如果我在带有块的 commit_on_success 事务中执行此操作,而不是使用保存点,也会发生同样的事情。我安装了 TransactionMiddleware,但我没有在自动提交模式下运行 PostgreSQL。
我可以通过简单地检查以确保不存在重复对象来避免这种情况,但我想了解我对 Django 事务的理解出了什么问题。是什么赋予了?