You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向字典添加数据时被覆盖?求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]

额外说明

  1. 如果你的value对应的是单个数据库字段,fetchall()返回的每个fnc只有一个元素,此时fnc[1]会触发索引报错,需要根据实际需求调整逻辑(比如将字段值作为键,统计次数或其他标识作为值)。
  2. 直接用f-string拼接SQL存在SQL注入风险,生产环境建议使用参数化查询,例如MySQL环境可以这样写:
    sql = "SELECT DISTINCT %s;"
    cursor.execute(sql, (value,))
    
    不同数据库的参数占位符可能不同(如PostgreSQL用%s,SQLite用?),请对应调整。

内容的提问来源于stack exchange,提问作者Tical

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:20:53