如何将SQLite SELECT语句的结果项逐个添加到列表中?
高效实现方法
首先,你当前的代码存在两个关键问题:
- 使用
f-string拼接SQL语句会引发SQL注入风险,这是严重的安全漏洞,必须杜绝。 cursor.fetchone()仅能获取查询结果的第一条记录,而你需要最近5局数据,应该用fetchall()获取所有匹配的记录。
针对你的需求,只需要一次SQL查询就能完成,无需重复执行多次查询,具体代码如下:
playeroutcomes = [] # 使用参数化查询,用?作为占位符,彻底避免SQL注入 cursor.execute(""" SELECT P1_Outcome, P2_Outcome, P3_Outcome, P4_Outcome, P5_Outcome FROM Game_History WHERE username = ? ORDER BY RecordID DESC LIMIT 5 """, (username,)) # 遍历查询到的每一条记录(对应最近5局游戏) for record in cursor.fetchall(): # 遍历当前记录中的每个结果项(P1到P5),逐个添加到目标列表 for outcome in record: playeroutcomes.append(outcome)
额外优化建议:调整表结构
从你的需求来看,当前表结构设计不够合理——如果P1_Outcome到P5_Outcome是同一玩家的5局游戏结果,更规范的设计是每局游戏对应一条独立记录,表字段可设置为:
- RecordID(自增主键)
- username(玩家用户名)
- outcome(单局游戏结果)
调整后,查询最近5局的代码会更简洁直观:
playeroutcomes = [] cursor.execute(""" SELECT outcome FROM Game_History WHERE username = ? ORDER BY RecordID DESC LIMIT 5 """, (username,)) # 直接提取每局结果到列表 playeroutcomes = [row[0] for row in cursor.fetchall()]
内容的提问来源于stack exchange,提问作者abxty
相关产品推荐
相关产品推荐

