到目前为止,我使用 Django 的大部分经验都是使用 MySQL 和 mysqldb。对于我正在编写的一个新应用程序,我正在将脚趾浸入 PostgreSQL 水中,因为我已经看到了曙光。
在编写数据导入脚本时,我偶然发现了默认自动提交行为的问题。我猜可能还会出现其他“陷阱”。我还应该注意什么?
到目前为止,我使用 Django 的大部分经验都是使用 MySQL 和 mysqldb。对于我正在编写的一个新应用程序,我正在将脚趾浸入 PostgreSQL 水中,因为我已经看到了曙光。
在编写数据导入脚本时,我偶然发现了默认自动提交行为的问题。我猜可能还会出现其他“陷阱”。我还应该注意什么?
Django 的自动提交和默认的 PostgreSQL 提交模式之间存在不一致。
开箱即用,Django 使用默认的 PostgreSQL 模式“已提交”,它将所有操作组合成一个事务,当 db 游标超出范围时结束。当这一系列操作期间发生错误时,就会出现问题。Postgres 希望您在继续之前发出回滚,如果您不这样做,psycopg2 会在您下次使用连接时抛出 InternalError。如果您依赖 Django 自动提交(默认),您可能无法正确回滚。
幸运的是,psycopg2 支持另一种称为“自动提交”的操作模式,其中它不会设置这些事务。对于那些来自 MySQL(或试图同时支持两者)的人来说,这给世界带来了一些理智。在 1.1 中,他们增加了对公开它的支持。将以下内容添加到您的设置中(如果您在中继上,则需要更改1.2 语法)
DATABASE_OPTIONS = {
"autocommit": True,
}
Django票#3460的讨论列出了坚韧不拔的细节。