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

如何使用cursor.executemany将JSON数据批量插入Oracle数据库

错误原因
  • executemany 入参格式不匹配:该方法第二个参数要求是由多条记录组成的序列,每条记录本身是对应占位符的序列/字典。你原代码中循环内每次传入单条记录的元组(id,name),不符合要求,直接触发类型错误。
  • 代码存在多处语法/方法名错误:Python字典取值方法为小写的get(),你写的大写Get()会直接触发属性错误;AttributeError中间不能加空格;cursor.executemany方法名首字母为小写。
  • 提交逻辑不合理:原代码每插入一条就执行一次commit(),频繁IO操作会导致插入速度极长,完全抵消批量插入的性能优势。
  • 字段取值逻辑与提供的JSON结构不匹配:示例JSON中data下没有test键,id存储在data->identifier->id路径下,name存储在data->Accounts[0]->Name路径下,原取值逻辑会始终拿到空值。
正确实现代码
import json
import requests
# 如果使用的是新版Oracle驱动则替换为 import oracledb
import cx_Oracle

# 插入语句
insert_statement = 'INSERT INTO mytable VALUES (:1,:2)'

# 请求接口获取数据
r = requests.get(url, cert=(auth_certificate, priv_key), verify=root_cert, timeout=3600, stream=True)
data = json.loads(r.text)

# 批量整理所有待插入的行数据
batch_rows = []
for item in data:
    # 以下取值适配示例JSON结构,和实际业务不符可自行调整路径
    try:
        id_val = item.get('data', {}).get('identifier', {}).get('id', '')
    except AttributeError:
        id_val = ''
    try:
        accounts = item.get('data', {}).get('Accounts', [])
        name_val = accounts[0].get('Name', '') if accounts else ''
    except (AttributeError, IndexError):
        name_val = ''
    batch_rows.append((id_val, name_val))

# 一次性执行批量插入
cursor.executemany(insert_statement, batch_rows)
# 统一提交事务
connection_target.commit()
额外性能优化建议
  • 数据量超过10万的场景可以拆分批次,比如每1000条执行一次executemany和commit,避免单次内存占用过高。
  • 插入前可临时关闭目标表的非必要索引、触发器,插入完成后再重建,可进一步提升插入速度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:45:05