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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:47:54