向字典添加数据时被覆盖?求Python数据库遍历代码修复方案
修复数据库查询结果写入字典的覆盖问题
你的代码存在几个关键错误,导致数据被覆盖且逻辑异常,以下是修复方案:
错误分析
- result字典重复初始化:每次遍历
qur_list.items()时都执行result = {},会清空之前循环积累的数据,最终只保留最后一次循环的结果。 - 键存在判断逻辑错误:
result.fromkeys([0], [1])会生成一个全新的临时字典(键为0,值为[1]),完全无法正确判断fnc[0]是否在目标字典result中。 - 值类型不统一:首次添加键时直接赋值单个值
fnc[1],后续append操作会因为值不是列表类型报错。
修复后的代码
if x is not None: # 将result初始化移到外层循环外,避免每次清空 result = {} for key, value in qur_list.items(): with conn.cursor() as cursor: sql = f"SELECT DISTINCT {value};" cursor.execute(sql) for fnc in cursor.fetchall(): # 确保查询结果包含至少两个字段(根据你的需求调整) if len(fnc) < 2: continue dict_key = fnc[0] dict_value = fnc[1] # 正确判断键是否存在 if dict_key in result: result[dict_key].append(dict_value) else: # 首次添加时用列表包裹值,方便后续追加 result[dict_key] = [dict_value]
额外说明
- 如果你的
value对应的是单个数据库字段,fetchall()返回的每个fnc只有一个元素,此时fnc[1]会触发索引报错,需要根据实际需求调整逻辑(比如将字段值作为键,统计次数或其他标识作为值)。 - 直接用f-string拼接SQL存在SQL注入风险,生产环境建议使用参数化查询,例如MySQL环境可以这样写:
不同数据库的参数占位符可能不同(如PostgreSQL用sql = "SELECT DISTINCT %s;" cursor.execute(sql, (value,))%s,SQLite用?),请对应调整。
内容的提问来源于stack exchange,提问作者Tical
相关产品推荐
相关产品推荐

