天行健,君子以自强不息;地势坤,君子以厚德载物;

Django在MySQL 5.7上使用GROUP BY执行原始SQL语句

将MySQL从5.6升级到5.7后,原有的语句执行报错:


X.objects.raw('SELECT id,created_time FROM Y GROUP BY created_time;')

(1055, "Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'Y.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by")

查找原因,原来是MySQL 5.7默认开启了only_full_group_by,一旦开启这个功能,只能获取受到其影响的字段信息,无法和其他未受其影响的字段共存,这样,group by 的功能将变得十分狭窄了,要关闭这个功能,要修改配置文件重启MySQL服务,那就保留默认配置吧。那如何解决呢?

原来在 mysql 中有一个函数: any_value(field) ,允许非分组字段的出现(和关闭 only_full_group_by 模式有相同效果)。

将语句改为:


SELECT ANY_VALUE(id),created_time FROM Y GROUP BY created_time;

从MySQL中测试一下,完美通过~~~~,修改Python脚本,运行,晕,又报错


Raw query must include the primary key
非法查询,原生SQL查询必须包含主键!

看来Django不认ANY_VALUE(id)这种方式啊,只好变通一下


X.objects.raw('SELECT ANY_VALUE(id) AS id,created_time FROM Y GROUP BY created_time;')

提交代码,运行,通过~~~~

点赞

发表回复