在某些情况下,注释会导致 OperationalError “字段不在 GROUP BY 中”

Posted

技术标签:

【中文标题】在某些情况下,注释会导致 OperationalError “字段不在 GROUP BY 中”【英文标题】:Annotation causes OperationalError "field isn't in GROUP BY" in some cases 【发布时间】:2015-11-20 16:53:12 【问题描述】:

我正在尝试如下注释某个模型:

items = MyModel.objects.all()
aggregated_items = items.annotate(Max('othermodel__some_integer_field'))

检查aggregated_items 时,我得到一个OperationalError

<repr(<parler.managers.TranslatableQuerySet at 0x7f69977066d0>) failed: django.db.utils.OperationalError: (1055, "'mydatabase.myapp_mymodel.some_unrelated_field' isn't in GROUP BY")>

奇怪的是,这在一个数据库服务器上工作得很好,但在另一个数据库服务器上却不行。我已经通过connections.queries 获得了底层查询,并在两个数据库上运行它,并且再次,一个数据库很乐意执行这个查询,而另一个返回错误。

为什么会发生这种情况?据我所知,这些方案是相等的,但我怀疑两个数据库服务器的设置存在一些差异。数据库服务器一台在 mysql 5.5.44 上运行,而另一台在 5.5.41 上运行。另一个需要注意的重要事情是,我正在使用来自国际化库 django-parler 的自定义管理器。

【问题讨论】:

【参考方案1】:

您的第二个数据库正在ONLY_FULL_GROUP_BY 模式下工作。

尝试覆盖模式:

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': 
            'sql_mode': 'traditional',
        
    

【讨论】:

是的,这就是问题的根本原因。谢谢! 这也修复了我的 OperationalError 1055,非常感谢!从其他地方,我读到关闭 ONLY_FULL_GROUP_BY 可能会使我面临格式不正确的查询的风险?还是 django 让我免受格式不正确的查询的影响?

以上是关于在某些情况下,注释会导致 OperationalError “字段不在 GROUP BY 中”的主要内容,如果未能解决你的问题,请参考以下文章

IDEA设置注释模板最佳实践

如何在没有jackson注释的情况下忽略反序列化的某些字段?

什么时候应该避免写代码注释?

Oracle中Hint被忽略的几种常见情形

Oracle中Hint被忽略的几种常见情形

为啥对话框会在不刷新的情况下删除其内容?