Python-PyMySQL的一些使用注意事项
一、关于group by的使用
在部分mysql版本(5.7.xx及以上)中,若select的列中,包含了未被group by的字段,会报以下错误:
[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'xxxx' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
错误原因是mysql这个版本之后的mysql默认开启了only_full_group_by模式。
有以下几个解决思路:
1、若无法修改sql_mode(大部分情况下,公司与客户不会允许修改),可选择以下方案:
修改SQL语句,在group by子句中将需要select的列都写上。(此方法需要注意,group by子句都加上select的列后,执行结果是否一致,大概率是不一致,查询结果会多分很多组,不推荐)
通过拆分成多个查询语句,如需要group by的语句单独一行,再写一个新语句进行后续查询
2、修改sql_mode(方法很多,改配置文件或者直接在mysql中设置均可,百度操作步骤)
二、在原生sql语句中,将某些变量放入执行语句中
# 查询某段时间内的一些数据
start_time = '2021-09-01 00:00:00.000'
end_time = '2022-09-25 23:59:59.999'
cursor.execute(
"SELECT b.username,COUNT(*),b.userid FROM review a LEFT JOIN users b ON a.creater_id = b.userid \
WHERE a.create_time BETWEEN %s AND %s GROUP BY b.userid,b.username ORDER BY COUNT(*) \
DESC;", (start_time, end_time))
三、在原生sql语句中,使用in时
# 查询某些数据,user_id IN 某个列表
user_id_list = [1,2,3]
sql_str = "SELECT DISTINCT u.user_id,r.role_name FROM user_role_con u LEFT JOIN \
role r ON u.role_id = r.role_id WHERE u.user_id IN %s;"
# 把该列表拼成一个元素,作为参数传入即可
cursor.execute(sql_str, (user_id_list,))
user_role_name = cursor.fetchall()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构