避免在 django 1.4 和 postgresql 8.1 中使用与 bug #10467 相关的 RETURN postgresql 语句

Posted

技术标签:

【中文标题】避免在 django 1.4 和 postgresql 8.1 中使用与 bug #10467 相关的 RETURN postgresql 语句【英文标题】:Avoid RETURN postgresql statment in django1.4 and postgresql 8.1 related to bug #10467 【发布时间】:2012-06-09 03:07:01 【问题描述】:

几天前,我在 django1.4 中使用管理功能编写了一个项目,目的是为从遗留系统迁移到新系统的调试数据制作 CRUD(迁移并不完全成功),我写道它使用 django 1.4 并在我的笔记本电脑中使用生产数据库的副本,但在我的 linux 中我使用 postgresql9.1,因此,当我尝试将项目配置为原始服务器(postgresql8.1)中的测试数据库时出现错误在syncdbmigrate 语句中:

File "/home/diegueus9/webapps/fixsysandinos/local/lib/python2.7/site-packages/django/db/backends/util.py", line 40, in execute
    return self.cursor.execute(sql, params)
  File "/home/diegueus9/webapps/fixsysandinos/local/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 52, in execute
    return self.cursor.execute(query, args)
django.db.utils.DatabaseError: syntax error at or near "RETURNING"
LINE 1: ...") VALUES (E'permission', E'auth', E'permission') RETURNING ...

所以,我做了一些研究,在 django 中找到了票 #10467(目前已关闭),上面说使用语句 RETURNING 在 postgresql 8.1 中引入了一个错误,因为它直到 8.2 才支持该语法(我认为),该错误在 8 个月前似乎已关闭,但我认为在某些时候被重新引入。在票的线程中说问题可能与自动提交行为有关并谈论connection.features.can_return_id_from_insert

所以问题是:

这是一个必须重新打开的错误?我必须禁用自动提交行为并承担风险(我不希望如此)或者通过设置我可以将connection.features.can_return_id_from_insert 设置为False 并以这种方式实现我的目标?

【问题讨论】:

PostgreSQL 8.1 版于 2010 年 12 月 EOL。 我同意弗兰克的观点。为什么不升级到受支持(并且更好)的 PostgreSQL 版本? 我无法升级数据库,因为客户负担不起迁移费用。 【参考方案1】:

当升级数据库或降级你的django版本不是一个选项,因为是客户端的要求,你仍然可以django1.4 在你自己的责任下你可以禁用RETURN语句设置@987654322 @ to False in django.db.backends.postgresql_psycopg2.base 在第 77 行。但这会影响 django 的行为,所以你真的必须或应该使用 virtualenvwrapper 之类的东西

【讨论】:

以上是关于避免在 django 1.4 和 postgresql 8.1 中使用与 bug #10467 相关的 RETURN postgresql 语句的主要内容,如果未能解决你的问题,请参考以下文章

使用 Django 从 Postgres 导出 JSON 时结果不一致

Django 和 postgres - 在模型字段中将数据存储为 json 的缺点

Django 无法在 Docker 设置中连接到 Postgres

Django 中的唯一模型字段和区分大小写(postgres)

Django 中的唯一模型字段和区分大小写(postgres)

django 和 postgres 的间歇性数据库错误:django 有时会尝试查询我几周前删除的数据库