使用PyMySQL时如何读取cursor.execute()的全部数据并排序?
解决PyMySQL获取完整数据集并按任意字段排序的问题
首先得指出你代码里的一个小问题:你先调用了cursor.fetchall()把所有结果都取到data里了,之后再遍历cursor是拿不到数据的——因为游标已经走到结果集末尾啦。所以正确的做法是直接用data来处理,不用再去遍历cursor。
接下来给你两种实用的方法,实现按任意参数排序:
方法1:通过索引访问字段(适合明确字段顺序的场景)
你的data里每一行都是一个元组,比如你给出的示例行:
1, '1170', 'AS0001', 1, '1', datetime.datetime(2018, 3, 15, 10, 56), Decimal('15185.7562'), Decimal('0.0000'), Decimal('19814.3181')
观察可知,timestamp是第6个元素(索引从0开始计数的话是5)。排序时直接用索引指定排序键即可:
# 正确获取完整数据集 cursor.execute(query) data = cursor.fetchall() # 按timestamp升序排序(reverse=False可省略,默认就是升序) sorted_list = sorted(data, key=lambda x: x[5], reverse=False) # 遍历排序后的结果 for row in sorted_list: print(row[0], row[1], row[5]) # 对应id、clientid、timestamp字段
方法2:将行转为字典(更直观,适配字段顺序变化的场景)
如果不想记索引,PyMySQL支持让游标返回字典类型的行,这样就能直接用字段名访问数据,步骤如下:
import pymysql # 创建连接时指定游标类型为DictCursor connection = pymysql.connect( host='你的数据库地址', user='你的用户名', password='你的密码', database='你的数据库名', cursorclass=pymysql.cursors.DictCursor # 关键配置 ) try: with connection.cursor() as cursor: cursor.execute(query) data = cursor.fetchall() # 现在每行数据都是字典格式 # 直接用字段名排序,逻辑更清晰 sorted_list = sorted(data, key=lambda x: x['timestamp'], reverse=False) # 遍历输出 for row in sorted_list: print(row['id'], row['clientid'], row['timestamp']) finally: connection.close()
这种方法的优势是,哪怕后续SQL查询的字段顺序调整,只要字段名不变,排序逻辑就不用修改,后期维护更省心。
额外优化建议:让数据库直接排序(大数据场景更高效)
如果你的数据集规模较大,在Python里排序的效率不如让MySQL直接返回排序后的结果。只需要在SQL语句末尾加上排序规则即可:
SELECT id, clientid, timestamp, ... FROM 你的表名 WHERE ... ORDER BY timestamp ASC; -- 升序 -- 或者降序 SELECT id, clientid, timestamp, ... FROM 你的表名 WHERE ... ORDER BY timestamp DESC;
这样cursor.fetchall()拿到的直接就是排好序的数据,省去了Python端的排序步骤。
内容的提问来源于stack exchange,提问作者Ratha
相关产品推荐
相关产品推荐

