【mysql】5.7以上的mysql使用group by 报错 (pymysql.err.OperationalError) (1055, “Expression #1 of SELECT list

15 篇文章 0 订阅
6 篇文章 0 订阅
文章讲述了在MySQL升级至5.7后,使用SQLAlchemy时遇到关于GROUPBY和distinct的错误,原因是新版本的sql_mode要求GROUPBY必须包含所有非聚合列。解决方法包括设置sql_mode为更宽松的模式,修改mysql.ini文件或在代码中动态设置sql_mode。
摘要由CSDN通过智能技术生成
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1055, "Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'yushu_book1.gift.create_time' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by")
[SQL: SELECT DISTINCT gift.create_time AS gift_create_time, gift.status AS gift_status, gift.id AS gift_id, gift.uid AS gift_uid, gift.isbn AS gift_isbn, gift.launched AS gift_launched, max(gift.create_time) AS max_1 
FROM gift 
WHERE gift.launched = false GROUP BY gift.isbn ORDER BY max(gift.create_time) DESC 
 LIMIT %(param_1)s]
[parameters: {'param_1': 30}]

原因:
在把MySQL升级到5.7或者更高的版本,一些以前看上去不会出错的group by 操作在这个版本以后就会出现语法报错的情况
解决:

set 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更新这种模式不是没有意义的:对于语义限制都比较严谨的多家数据库,如SQLServer、Oracled等数据库都不支持select target list中出现语义不明确的列,这样的语句在这些数据库中是会被报错的,所以从MySQL 5.7版本开始修正了这个语义,就是所说的ONLY_FULL_GROUP_BY语义。

    # 必须要推入上下文才能使用
    with app.app_context():
        db.drop_all()
        db.create_all()
        # sql = "set @@GLOBAL.sql_mode =’’";
        # db.session.execute(sql)
        sql = "SET sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'"
        db.session.execute(sql)
        db.session.commit()

还有就是改mysql.ini文件,我没有这么做
还可以指定查询的字段,将create_time 放到 select中,让他含义明确。

by the way 查询的原始sql:

SELECT DISTINCT gift.create_time AS gift_create_time, gift.status AS gift_status, gift.id AS gift_id, gift.uid AS gift_uid, gift.isbn AS gift_isbn, gift.launched AS gift_launched, max(gift.create_time) AS max_1 
FROM gift 
WHERE gift.launched = false GROUP BY gift.isbn ORDER BY max(gift.create_time) DESC 
 LIMIT %(param_1)s
2024-02-29 14:18:23,975 INFO sqlalchemy.engine.Engine SELECT DISTINCT gift.create_time AS gift_create_time, gift.status AS gift_status, gift.id AS gift_id, gift.uid AS gift_uid, gift.isbn AS gift_isbn, gift.launched AS gift_launched 
FROM gift 
WHERE gift.launched = false GROUP BY gift.isbn ORDER BY gift.create_time DESC 
 LIMIT %(param_1)s

去掉distinct 一样报错

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1055, "Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'yushu_book1.gift.create_time' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by")
[SQL: SELECT gift.create_time AS gift_create_time, gift.status AS gift_status, gift.id AS gift_id, gift.uid AS gift_uid, gift.isbn AS gift_isbn, gift.launched AS gift_launched 
FROM gift 
WHERE gift.launched = false GROUP BY gift.isbn ORDER BY gift.create_time DESC 
 LIMIT %(param_1)s]

那么 group by 和 distinct 连用的作用是什么

distinct 是把distinct 后面的字段都去重了,而group by 仅仅是就create_time分的组,除非是 create_time 不同,反正这个sql放在这里怪怪的,我认为,是要distinct isbn 也就是 按时间倒叙排列的不一样的图书!!!!

情况有变

因为sqlalchemy使用的是连接池,有的执行了,有的没执行,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配置my.cnf(windows下面是my.ini),删除only_full_group_by属性,通过命令行进行修改

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值