如何通过Pandas直接将数据写入Oracle表(跳过CSV步骤)
直接将Pandas DataFrame写入Oracle表(跳过CSV步骤)
嘿,完全可以跳过写入CSV的中间步骤,直接把你的dataset DataFrame写入Oracle表!下面给你两种适配cx_Oracle场景的实用方法:
方法一:用cx_Oracle原生批量插入(灵活可控)
这种方式直接借助cx_Oracle的executemany做批量插入,适合需要精细控制插入逻辑的场景:
import cx_Oracle as cx import pandas as pd import requests # --- 你的现有代码部分 --- response = requests.get(url) # 假设你已经把响应处理成了dataset DataFrame dataset = pd.DataFrame(...) # 你的目标DataFrame数据 # --- 直接写入Oracle的核心代码 --- # 1. 建立数据库连接(替换成你的实际连接信息) dsn_tns = cx.makedsn('你的数据库主机', '端口号', service_name='你的服务名') conn = cx.connect(user='用户名', password='密码', dsn=dsn_tns) cursor = conn.cursor() # 2. 构造插入SQL:占位符顺序要和DataFrame列、Oracle表列完全匹配 table_name = "TARGET_TABLE" # 替换成你的目标表名 columns = ", ".join(dataset.columns) placeholders = ", ".join([f":{i+1}" for i in range(len(dataset.columns))]) insert_sql = f"INSERT INTO {table_name} ({columns}) VALUES ({placeholders})" # 3. 将DataFrame转换为批量插入支持的列表格式 data_to_insert = dataset.values.tolist() # 4. 执行批量插入(可选设置arraysize提升大数量场景的性能) cursor.setinputsizes(*[cx.NUMBER, cx.VARCHAR2, ...]) # 可选:指定字段类型优化性能 cursor.executemany(insert_sql, data_to_insert, batcherrors=True) # batcherrors允许跳过错误行 # 5. 提交事务并清理连接 conn.commit() cursor.close() conn.close()
关键注意点:
- 务必保证
dataset的列顺序和Oracle表的列顺序完全一致,否则会出现数据错位 - 数据量较大时,调整
cursor.arraysize(比如设为1000)能显著提升插入效率 - 开启
batcherrors=True后,可通过cursor.getbatcherrors()查看插入失败的行信息
方法二:用Pandas的to_sql方法(简洁高效)
如果追求代码简洁,Pandas的to_sql可以结合SQLAlchemy的Oracle引擎,一键完成写入:
import pandas as pd import requests from sqlalchemy import create_engine # --- 你的现有代码部分 --- response = requests.get(url) dataset = pd.DataFrame(...) # 你的目标DataFrame数据 # --- 用to_sql直接写入 --- # 构造SQLAlchemy连接字符串(格式:oracle+cx_oracle://用户:密码@主机:端口/?service_name=服务名) engine = create_engine('oracle+cx_oracle://用户名:密码@你的主机:端口/?service_name=你的服务名') # 写入数据:按需调整if_exists参数 dataset.to_sql( name='TARGET_TABLE', # 目标表名 con=engine, if_exists='append', # 可选:'append'追加、'replace'替换表、'fail'存在则报错 index=False, # 不要把DataFrame的索引写入表 chunksize=1000 # 分块写入,避免大数据量内存溢出 )
关键注意点:
- 需要先安装SQLAlchemy:
pip install sqlalchemy - 如果用SID而非service_name,连接字符串格式改为
oracle+cx_oracle://用户:密码@主机:端口/SID chunksize可根据数据量调整,平衡内存占用和插入速度
两种方法都能完美跳过CSV步骤,直接完成数据写入,按需选择即可!
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

