如何使用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
相关产品推荐
相关产品推荐

