sqlite3迭代查询过慢优化后返回sqlite3.Row无法读取Name字段求助
问题修复方案
1. sqlite3.Row属性访问报错修复
报错原因是sqlite3.Row对象不支持点属性访问,正确取值方式有两种:
- 下标索引:
mover[0][0]取查询结果第一个字段的值 - 字段名索引:
mover[0]['Name']按查询的字段名直接取值,可读性更高
如果确实需要点属性访问,可以自定义row_factory,更推荐直接使用字段名索引的方式,无需额外修改配置。
2. getMoverList逻辑对齐&性能优化
你修改后的版本没有执行原有的compareRanks调用逻辑,且conn.close()写在return之后永远不会执行,属于资源泄漏。修复后的代码既保留业务逻辑,又提升运行效率:
def getMoverList(): # 用with上下文管理器自动管理连接,无需手动调用close,报错也会自动释放资源 with get_db_connection() as conn: # 只查询需要用到的Name字段,减少不必要的数据传输开销,ORDER BY直接写在SQL层 rows = conn.execute('SELECT Name FROM table ORDER BY CAST(Points AS int) DESC').fetchall() # 用列表推导式代替逐行append,迭代效率更高 return [compareRanks(row['Name']) for row in rows]
同时修复了原SQL中Points后多余的逗号语法错误。
3. getLastRank逻辑&连接问题修复
原代码存在两个核心问题:一是找到玩家后直接return,永远不会执行conn.close();二是查询全表再遍历匹配玩家,数据量大时性能极差。修复后代码如下:
def getLastRank(playerName): with get_db_previous() as conn: # 直接在SQL层用参数化查询过滤目标玩家,避免全表扫描,性能提升显著 rank = conn.execute(""" SELECT ROW_NUMBER() OVER (ORDER BY Points DESC) Rank FROM alltime WHERE Name = ? """, (playerName,)).fetchone() # 找到返回排名,没找到返回自定义默认值即可 return rank[0] if rank else None
无需手动管理连接关闭,也不会出现提前关闭连接的报错,同时解决了原逻辑中if playerName in item判断不准确的隐性bug。
内容的提问来源于stack exchange,提问作者fk1
相关产品推荐
相关产品推荐

