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

迭代DataFrame调用MongoDB查询存CSV时仅生成首文件且报KeyError问题

问题分析与解决:MongoDB查询迭代生成CSV时的KeyError问题

问题描述

迭代存储任务列表的DataFrame,调用MongoDB查询并将结果保存为CSV文件时,仅成功生成第一个文件(0.csv),处理第二行数据时触发KeyError: 'database',数据库连接本身无异常。

错误原因

核心问题是变量名冲突:循环内部将MongoDB查询结果重新赋值给了原本存储任务列表的df变量。第一次循环执行后,原有的df(包含database/entity/sql列)被替换成了查询结果的DataFrame,而这个新DataFrame并没有database列,导致第二次循环读取列时触发KeyError。

修复后的代码

将循环内存储查询结果的变量名改为其他名称(比如result_df),避免覆盖原任务列表DataFrame:

sql = [
    ('tran','transactions',{"den": "00100002773060"}),
    ('tran','Data',{'name': 'john'}), 
]

df = pd.DataFrame(sql, columns = ["database", "entity", "sql"])

for i in range(len(df)):    
    database = df.iloc[i]["database"]
    entity=df.iloc[i]["entity"]
    myquery=df.iloc[i]["sql"]

    collection = client[database][entity]

    try:
        mydoc = list(collection.find(myquery))
        if len(mydoc) > 0:        
            # 改用独立变量名,避免覆盖原任务列表df
            result_df = pd.DataFrame(mydoc)
            result_df.pop("_id")        
            result_df.to_csv(str(i) + '.csv')
            print("file saved")
    except Exception as e:
        # 捕获具体异常信息,便于排查问题
        print(f"error on file {i}: {str(e)}")

额外优化建议

  • 更简洁的遍历方式:避免用range(len(df)),直接迭代DataFrame的行:
for idx, row in df.iterrows():
    database = row["database"]
    entity = row["entity"]
    myquery = row["sql"]
    # 后续逻辑同上
  • 不要使用空except:捕获具体异常类型并打印错误信息,能快速定位问题
  • 提前校验:可以先检查目标数据库和集合是否存在,避免额外的连接错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:15:28