如何在Python中将MongoDB游标结果转为DataFrame以写入Oracle表?
将MongoDB嵌套查询结果转换为DataFrame并写入Oracle
解决方案步骤
你的查询结果是嵌套结构(activities为数组,内部包含嵌套字典flowCenterInfo),需要先扁平化结构才能适配Oracle的关系型表结构,用Pandas的explode和json_normalize可以轻松处理:
1. 导入依赖库
import pandas as pd from sqlalchemy import create_engine
2. 处理嵌套数据并转换为扁平DataFrame
# 你的MongoDB查询结果x x = list(coll.find({"activities.flowCenterInfo": {'$exists': True}}, {'activities.activityId':1,'activities.flowCenterInfo':1,'_id':0}).limit(5)) # 第一步:将列表转为DataFrame,并展开activities数组(每个数组元素拆为单独行) df = pd.DataFrame(x).explode('activities', ignore_index=True) # 第二步:扁平化嵌套的activities字段,自动展开flowCenterInfo内的键为单独列 df_flat = pd.json_normalize(df['activities']) # 可选:重命名列名以适配Oracle表字段(比如改为大写下划线命名) df_flat = df_flat.rename(columns={ 'flowCenterInfo.processId': 'PROCESS_ID', 'flowCenterInfo.demandComplaintSubject': 'COMPLAINT_SUBJECT', 'flowCenterInfo.demandComplaintDetailSubject': 'COMPLAINT_DETAIL_SUBJECT', 'flowCenterInfo.demandComplaintId': 'COMPLAINT_ID', 'activityId': 'ACTIVITY_ID' })
3. 写入Oracle数据库
使用SQLAlchemy连接Oracle并写入数据(需提前安装cx_Oracle和sqlalchemy):
# 创建Oracle连接引擎,替换为你的实际连接信息 engine = create_engine('oracle+cx_oracle://username:password@host:port/service_name') # 将DataFrame写入Oracle表,if_exists参数可选'replace'(覆盖)或'append'(追加) df_flat.to_sql('YOUR_ORACLE_TABLE_NAME', engine, if_exists='append', index=False)
关键说明
explode('activities'):解决activities是数组的问题,将每个数组元素拆分为独立行,符合关系型数据库的行记录逻辑。json_normalize:自动解析嵌套字典,将flowCenterInfo内的键值对展开为DataFrame的列,避免手动提取嵌套字段的繁琐。- 列名重命名:Oracle通常使用大写下划线命名,建议将DataFrame列名调整为与Oracle表字段一致,避免写入时的字段匹配问题。
内容的提问来源于stack exchange,提问作者Erdal Tutku YILMAZ
相关产品推荐
相关产品推荐

