You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo 15社区版partner.active字段SQL分组报错问题求助

Odoo 15社区版数据库报错:column "partner.active" must appear in the GROUP BY clause or be used in an aggregate function

问题场景

使用Odoo 15社区版(版本15.0-20230710),在对账、自定义模型发送邮件等操作时触发数据库报错,涉及mail模块(版本15.0.1.5)。

报错信息

2023-08-03 13:24:12.933 UTC [587] ERROR:  column "partner.active" must appear in the GROUP BY clause or be used in an aggregate function at character 670

触发报错的SQL语句

SELECT DISTINCT ON (pid) * FROM (

    WITH sub_followers AS (

        SELECT fol.partner_id,
               coalesce(subtype.internal, false) as internal
          FROM mail_followers fol
          JOIN mail_followers_mail_message_subtype_rel subrel ON subrel.mail_followers_id = fol.id
          JOIN mail_message_subtype subtype ON subtype.id = subrel.mail_message_subtype_id
         WHERE subrel.mail_message_subtype_id = 5
           AND fol.res_model = 'account.move'
           AND fol.res_id IN (466)


     UNION ALL


        SELECT id,
               FALSE
          FROM res_partner
         WHERE id=ANY('{}')
    )
    SELECT partner.id as pid,
           partner.active as active,
           partner.partner_share as pshare,
           users.notification_type AS notif,
           array_agg(groups_rel.gid) AS groups
      FROM res_partner partner
 LEFT JOIN res_users users ON users.partner_id = partner.id
                          AND users.active
 LEFT JOIN res_groups_users_rel groups_rel ON groups_rel.uid = users.id
      JOIN sub_followers ON sub_followers.partner_id = partner.id
                        AND (NOT sub_followers.internal OR partner.partner_share IS NOT TRUE)
        GROUP BY partner.id,
                 users.notification_type
) AS x

ORDER BY pid, notif

问题分析

报错核心原因是PostgreSQL的分组查询规则:非聚合列必须出现在GROUP BY子句中。
在上述SQL的内层查询里,SELECT了partner.active和partner.partner_share两个字段,但GROUP BY仅包含partner.id和users.notification_type,不符合PostgreSQL的严格语法要求,因此触发报错。这是mail模块的代码缺陷,生成的SQL语句未遵循分组查询规范。

解决方案

方案1:修复mail模块代码

找到mail模块中生成该SQL的代码位置(通常在处理关注者通知的逻辑里),修改分组逻辑:

  • 把partner.active和partner.partner_share添加到GROUP BY子句中;
  • 或者对这两个字段使用聚合函数(比如MAX(partner.active)、MAX(partner.partner_share)),由于partner.id是主键,聚合后结果不会失真。

修改后的内层查询GROUP BY部分示例:

GROUP BY partner.id,
         users.notification_type,
         partner.active,
         partner.partner_share

方案2:升级mail模块到最新兼容版本

检查Odoo官方仓库的mail模块15.0分支,确认是否已修复该bug,直接升级到最新的15.0.x版本(比如15.0.1.6及以上)。

方案3:临时调整PostgreSQL配置(不推荐)

修改PostgreSQL的postgresql.conf,设置sql_mode = 'nonstrict'(或对应参数)关闭严格分组检查,但此方法会降低数据库查询的规范性,可能引发其他潜在问题,仅作为临时应急方案。

内容的提问来源于stack exchange,提问作者Black_Syphilis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 18:05:25