Django 正在为 Postgres 生成无效的 SQL

Posted

技术标签:

【中文标题】Django 正在为 Postgres 生成无效的 SQL【英文标题】:Django is generating invalid SQL for Postgres 【发布时间】:2013-01-26 05:59:45 【问题描述】:

我是一个菜鸟 django 用户,我在使用 Model.objects.all 方法时遇到了一些问题。 我有一个用户模型: (我知道以明文形式保存密码是不好的做法,但这只是一个玩具示例)

class UsersModel(models.Model):
    password = models.CharField(max_length=MAX_PASSWORD_LENGTH)
    user = models.CharField(max_length=MAX_USERNAME_LENGTH, primary_key=True)
    count = models.IntegerField()

我有一个测试方法应该删除用户表中的所有条目:

def function(self):
    UsersModel.objects.all().delete()

由于某种原因,调用 UsersModel.objects.all() 会引发错误

DatabaseError: column "cs169proj1_usersmodel.user" must appear in the GROUP BY clause or 
be used in an aggregate function
LINE 1: SELECT "cs169proj1_usersmodel"."user", "cs169proj1_usersmode...

通过谷歌搜索,我发现 SQL 中的这个特定错误只出现在 Postgresql(我正在使用)上。有谁知道如何解决/解决这个问题?

【问题讨论】:

你有这个模型的自定义管理器吗? 我认为这不是错误的原因,但在使用 id 以外的其他内容作为 primary_key 时应该小心。它可能会导致管理站点出现问题:请参阅***.com/q/2011629/117092 修复了!我删除并重新创建了数据库,然后运行 ​​manage.py syncdb。不知道它是什么,但它现在已经消失了。 【参考方案1】:

听起来列名 count 被误解为 aggregate function。

最佳解决方案:永远不要使用reserved words 作为标识符。

【讨论】:

这在删除计数列后仍然存在。我选择 count 作为名称,因为这是一个类项目,我只是遵循规范。 @Yuji'Tomita'Tomita:当然,如果 count 被误认为是聚合函数,它不会引用字段。 好点......即使 django 引用所有 SELECT args,postgresql 也会感到困惑吗? “表”。“计数”。 @Yuji'Tomita'Tomita:不,不能混淆 PostgreSQL。列名称为count,而聚合函数为count(something)。这种混乱必须发生在食物链的早期。而且我不相信这就是实际发生的事情,但无论如何我的建议都是好的。 感谢您的回复!他们对我很有见地!【参考方案2】:

我在使用 postgresql 从 django 1.6 升级到 1.9.8 时遇到了类似的问题。

在我的情况下,问题是由于 Django 1.9 中的更改至少需要 postgresql 9.1,如 here 所述。

redhat/centos here 的不错的 postgresql 更新说明。

【讨论】:

以上是关于Django 正在为 Postgres 生成无效的 SQL的主要内容,如果未能解决你的问题,请参考以下文章

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

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

如何将 Django 的身份验证用户模型配置为具有 UUID(Postgres DB)

在 Docker 上使用 Nginx、uWSGI 和 Postgres 配置 Django

Postgres INSERT 为 json 返回“无效的输入语法”

按客户细分 Mongo/Postgres 数据库的正确策略?