1

我使用 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 事务的理解出了什么问题。是什么赋予了?

4

1 回答 1

3

我有同样的问题。我查看了 Postgres 日志文件,可以看到在导致完整性错误的查询之后正在运行另一个查询,这导致实际错误在默认事务设置中黯然失色。我发现额外的查询来自django-debug-toolbarapp.

谷歌向我指出了https://github.com/django-debug-toolbar/django-debug-toolbar/issues/351这似乎解决了这个问题。

简而言之,如果您使用 django-debug-toolbar<=0.9.4,禁用它可以解决问题。

于 2013-07-22T11:34:40.950 回答