Python-PyMySQL的一些使用注意事项

发布时间 2023-08-24 10:51:53作者: 王寄鱼

一、关于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()