迭代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
相关产品推荐
相关产品推荐

