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
相关产品推荐
相关产品推荐

