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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:17:43