今天使用了flask-sqlalchemy进行分组时发现错误
messages = Message.query.filter_by(message_getter=user_id).order_by(Message.create_time.desc()).group_by(Message.message_sender).all()
发现报错
pymysql.err.InternalError:
(1055, "Expression #1 of SELECT list is not in GROUP BY clause
and contains nonaggregated column 'guoer.message.id' which is not functionally dependent on columns in GROUP BY clause;
this is incompatible with sql_mode=only_full_group_by")
重点在这句话
sql_mode=only_full_group_by
意思是当前数据库的
MySQL5.7版本默认设置了
mysqlsql_mode=only_full_group_by
属性
原因:
sql_mode=only_full_group_by属性
对于 GROUP BY 聚合操作,如果 SELECT中 的列,没有在 GROUP BY 中出现,那么将认为这个 SQL 是不合法的
select 选取分组中的列+聚合函数 from 表名称 group by 分组的列
从语法格式来看,是先有分组,再确定检索的列,检索的列只能在参加分组的列中选。
所以解决方法就是可以去设置取消这个属性
Ubuntu下:
修改/etc/mysql/mysql.conf.d/mysqld.cnf
文件
在[mysql]下方加入
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
添加完成后,重新启动MySQL服务,MySQL报错消失。
✍ 常用命令
systemctl restart mysql.service #重启
systemctl stop mysql.service # 停止
systemctl start mysql.service # 运行
systemctl status mysql.service # 状态