将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;')
提交代码,运行,通过~~~~