从 MySQL 迁移到 PostgreSQL 时,Django 用户应该了解什么?

发布于 2024-08-28 01:14:37 字数 255 浏览 7 评论 0 原文

到目前为止,我使用 Django 的大部分经验都是使用 MySQL 和 mysqldb。对于我正在编写的新应用程序,我正在尝试 PostgreSQL 水,现在我已经 看到了曙光

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

Most of my experience with Django thus far has been with MySQL and mysqldb. For a new app I'm writing, I'm dipping my toe in the PostgreSQL water, now that I have seen the light.

While writing a data import script, I stumbled upon an issue with the default autocommit behavior. I would guess there are other "gotchas" that might crop up. What else should I be on the lookout for?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

装纯掩盖桑 2024-09-04 01:14:37

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

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

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

DATABASE_OPTIONS = {
    "autocommit": True,
}

关于 Django 票证 #3460 的讨论列出了详细信息。


There's an inconsistency between Django's autocommit and the default PostgreSQL commit mode.

Out of the box, Django uses the default PostgreSQL mode "read committed" which combines all operations into a single transaction that ends when the db cursor goes out of scope. The problem arises when an error occurs during that series of operations. Postgres expects you to issue a rollback before continuing, and if you don't, psycopg2 throws an InternalError the next time you go to use the connection. If you're relying on the Django autocommit (the default), you're probably not going to rollback properly.

Luckily, psycopg2 has support for another mode of operation called "autocommit" wherein it doesn't set these transactions up. For those coming from MySQL (or trying to support both), this brings some sanity to the world. In 1.1 they added support to expose it. Add the following to your settings (needs to be changed for 1.2 syntax if you're on trunk)

DATABASE_OPTIONS = {
    "autocommit": True,
}

The discussion for Django ticket #3460 lays out the gritty details.


~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文