Django ProgrammingError 必须出现在 GROUP BY

给它任何基本模型说;


class Post(models.Model):

    created = models.DateTimeField(auto_now_add=True)

    title = models.CharField(_('Title'), max_length=100)

    content = models.TextField(_('Content html'), max_length=65000)

    author = models.ForeignKey('user.User', on_delete=models.SET_NULL)

像Post.objects.annotate(Count('id'))(或任何字段,任何 annotate())这样的查询失败并显示以下错误:


ProgrammingError: column "post.created" must appear in the GROUP BY clause or be used in an aggregate function

LINE 1: SELECT "post"."id", "post"."created", "post"."ti...

使用 django 1.11.16 和 postgres 9.4.19。


正如我在另一个 stackoverflow 问题中读到的,尝试了不同的 django 版本和 postgres 版本;使用 django 2.0、2.1.2、postgres 9.5.. 同样的错误!环顾四周,我发现这可能是与 SQL 相关的问题,但我仅在一台运行 Ubuntu 18.04(仿生)的服务器上遇到此问题。在Ubuntu的16.04本地运行的查询,使用Django 1.11.16,或任何高于和Postgres 9.4或以上,我的本地系统运行正常版本。所以这个问题可能实际上可能是一些低级别库有关,我不运行复杂的查询,任何带有 django 1.11+ 的简单 annotate() 都会在带有 postgres 9.4 或 9.5 的 ubuntu 18.04 中失败


[更新] 如果您发现自己处于这种情况下而对发生的事情一无所知,则可能对您有用,请验证有问题的表是否已创建其索引。我的问题原来是posts表没有PRIMARY KEY定义也没有任何其他约束,一个失败,pg_restore它恢复了所有数据和一些模式定义,是的,你没看错,一些其他模式定义丢失了,不知道为什么......但不是试图调试pg_restore首先发生的事情,我python manage migrate在一个空数据库上运行了一个初始值,因此这次正确创建了模式并验证了 ( psql -d <db_name> -c '\d posts'),然后pg_restore再次运行--data-only和--disable-triggers 标志..所以最后我得到了正确恢复的模式和数据并且查询工作


ITMISS
浏览 185回答 2
2回答

沧海一幻觉

该错误消息是因为当查询中有聚合函数时,PostgreSQL 不会猜测如何处理非分组列。这是 Django ORM 挥手过多并允许我们用脚射击自己的情况之一。我对使用 Django 2.1 的项目和另一个使用 1.11 的项目进行了测试Model.objects.annotate(Count('id')),没有任何问题。如果您发布完整的 QuerySet,人们将能够进一步帮助您。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python