Python Django ProgrammingError必须出现在GROUP BY子句中或在聚合函数中使用
给它任何基本的模型,比如说Python Django ProgrammingError必须出现在GROUP BY子句中或在聚合函数中使用,python,django,postgresql,group-by,Python,Django,Postgresql,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(
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
正如我在这里读到的,我尝试了不同的django版本和postgres版本;使用django 2.0、2.1.2和postgres 9.5。。同样的错误!环顾四周,我发现这可能是一个与SQL相关的问题,但我只在一台运行Ubuntu18.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-c'\d posts'
),然后使用--仅数据
和--禁用触发器
标志再次运行pg\u restore
。。最后,我得到了正确恢复的模式和数据,查询工作正常。错误消息是因为当查询中有聚合函数时,PostgreSQL不会猜测如何处理未分组的列。这是Django-ORM手太多,让我们射中自己脚的情况之一
我在使用Django 2.1的项目上运行了一个测试,另一个使用1.11和
Model.objects.annotate(Count('id'))
的项目上运行了一个测试,没有任何问题。如果您发布完整的查询集,人们将能够进一步帮助您。我遇到了问题,并解决了它。
您应该添加.order\u by(“xxx”)
遵循您的ORM
之前:
search_models.Author.objects.values("first_institution", 'institution_code').annotate(counts=Count('first_institution'))
之后:
search_models.Author.objects.values("first_institution", 'institution_code').annotate(counts=Count('first_institution')).order_by('-counts')
它对我有用,也希望能帮助你。你能发布
打印(post.objects.annotate(Count('id')).query)的输出吗?
?这将是来自查询集中的sql查询。在注释时对id
s进行计数没有多大意义,因为每行包含一条记录,因此计数始终为1(或者0
如果NULL
@WillemVanOnsem:这是真的。但这并不能解释他们为什么会出现这个SQL错误。因此,您链接的问题的结论是,这个错误特定于数据库视图而不是数据库表支持的模型。如果您只在生产数据库中遇到这个错误,您应该调查e db schema并查找生产数据库和开发数据库之间的任何差异。嘿,伙计们,我将在这里更新我的问题;是的,据我目前所知,如果您确实在ID上有索引,则仅按ID分组而不引用SELECT的其他字段是有效的。由于某些奇怪的原因,在pg_还原后,结果是这样的(我未能发现)数据已恢复,但部分(并非全部)架构定义丢失..例如posts表没有主键语句,因此注释failsThanks@schillingt!是的,有时抽象层中有太多的魔力,这使得在极端情况下调试变得复杂:/I我想是什么问题,当使用pg_restore恢复转储时,表没有架构,数据在那里,但表没有索引,没有约束,主键..这就是导致此处查询失败的问题,为什么pg_restore无法还原某些*(不是全部)表的架构..不知道..在尝试调试pg_restore之前,设计了一种解决方法并按此方法进行