如何用Python将JSON对象批量导入Oracle表(替代PostgreSQL方案)
实现Oracle单JSON对象对应单记录的批量导入
我之前也碰到过类似的需求,用Oracle官方维护的oracledb库(原cx_Oracle的升级替代)就能完美解决这个问题,不需要把整个JSON存成CLOB,完全可以像PostgreSQL那样实现单JSON对象对应单表记录的批量插入。下面是具体的实现步骤和代码示例:
1. 安装依赖库
首先确保你安装了oracledb,这是Oracle官方推荐的Python驱动,比旧的cx_Oracle更易用且支持更多Python版本:
pip install oracledb
2. 完整实现代码
下面的代码会读取JSON文件,解析成对象列表,然后批量插入到Oracle的PRODUCT表中:
import oracledb import json # 第一步:读取并解析JSON文件 with open('products.json', 'r', encoding='utf-8') as json_file: json_object_list = json.load(json_file) # 第二步:配置Oracle数据库连接信息 db_config = { "user": "你的数据库用户名", "password": "你的数据库密码", "dsn": "数据库主机地址:端口号/服务名" # 例如:"localhost:1521/ORCLPDB1" } # 第三步:连接数据库并执行批量插入 with oracledb.connect(**db_config) as conn: # 开启游标 with conn.cursor() as cursor: # 注意Oracle的绑定变量使用冒号(:)前缀,要和JSON中的键名对应 insert_sql = """ INSERT INTO PRODUCT (PRODUCT_ID, PRODUCT_NAME, PRODUCT_DESCRIPTION) VALUES (:product_id, :product_name, :product_description) """ # 使用executemany批量插入,直接传入JSON对象列表即可 cursor.executemany(insert_sql, json_object_list) # 提交事务(必须手动提交,否则数据不会写入) conn.commit() print(f"成功插入 {cursor.rowcount} 条记录")
3. 关键差异点(和PostgreSQL实现对比)
- 绑定变量格式:Oracle使用
:变量名,而不是PostgreSQL的%(变量名)s - 驱动库:用
oracledb替代psycopg2,这是Oracle官方的标准驱动 - 批量插入方法:Oracle的
executemany和PostgreSQL的execute_batch功能类似,都支持批量处理数据
4. 优化建议(针对大数据量场景)
如果你的JSON文件非常大(比如几十万条记录),可以分批次处理,避免内存占用过高,类似PostgreSQL的page_size参数:
batch_size = 1000 # 每批次处理1000条 total_records = len(json_object_list) with oracledb.connect(**db_config) as conn: with conn.cursor() as cursor: insert_sql = """ INSERT INTO PRODUCT (PRODUCT_ID, PRODUCT_NAME, PRODUCT_DESCRIPTION) VALUES (:product_id, :product_name, :product_description) """ for i in range(0, total_records, batch_size): batch_data = json_object_list[i:i+batch_size] cursor.executemany(insert_sql, batch_data) conn.commit() print(f"已完成第 {i//batch_size +1} 批次,累计插入 {min(i+batch_size, total_records)} 条记录")
另外,对于超大规模的数据,还可以使用数组绑定的方式进一步提升插入效率,把每个字段的取值单独提取成数组后批量插入:
# 提取每个字段的数组 product_ids = [item['product_id'] for item in json_object_list] product_names = [item['product_name'] for item in json_object_list] product_descriptions = [item['product_description'] for item in json_object_list] with oracledb.connect(**db_config) as conn: with conn.cursor() as cursor: insert_sql = """ INSERT INTO PRODUCT (PRODUCT_ID, PRODUCT_NAME, PRODUCT_DESCRIPTION) VALUES (:1, :2, :3) """ # 使用数组绑定,效率比单对象列表更高 cursor.executemany(insert_sql, [product_ids, product_names, product_descriptions]) conn.commit()
5. 注意事项
- 确保JSON中的键名和Oracle表的字段名对应(Oracle默认不区分字段名大小写,除非创建表时用双引号强制区分)
- 如果JSON中存在缺失字段的对象,需要提前处理(比如设置默认值或者跳过该记录),避免插入报错
- 确保数据库用户有
PRODUCT表的INSERT权限
内容的提问来源于stack exchange,提问作者john-bright
相关产品推荐
相关产品推荐

