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