6

到目前为止,我使用 Django 的大部分经验都是使用 MySQL 和 mysqldb。对于我正在编写的一个新应用程序,我正在将脚趾浸入 PostgreSQL 水中,因为我已经看到了曙光

在编写数据导入脚本时,我偶然发现了默认自动提交行为的问题。我猜可能还会出现其他“陷阱”。我还应该注意什么?

4

1 回答 1

11

Django 的自动提交和默认的 PostgreSQL 提交模式之间存在不一致。

开箱即用,Django 使用默认的 PostgreSQL 模式“已提交”,它将所有操作组合成一个事务,当 db 游标超出范围时结束。当这一系列操作期间发生错误时,就会出现问题。Postgres 希望您在继续之前发出回滚,如果您不这样做,psycopg2 会在您下次使用连接时抛出 InternalError。如果您依赖 Django 自动提交(默认),您可能无法正确回滚。

幸运的是,psycopg2 支持另一种称为“自动提交”的操作模式,其中它不会设置这些事务。对于那些来自 MySQL(或试图同时支持两者)的人来说,这给世界带来了一些理智。在 1.1 中,他们增加了对公开它的支持。将以下内容添加到您的设置中(如果您在中继上,则需要更改1.2 语法)

DATABASE_OPTIONS = {
    "autocommit": True,
}

Django票#3460的讨论列出了坚韧不拔的细节。


于 2010-04-10T18:06:54.047 回答