通过 Python 的 jaydebeapi 批量插入 Oracle 数据库

Bulk inserts into Oracle database via Python's jaydebeapi

我想将数据从 SQLite3 文件批量复制到 Oracle 数据库,并使用 jaydebeapi 模块从 Python 脚本中以编程方式执行此操作。 (我无法控制选择 Python + jaydebeapi 来执行此操作;它是由我正在合作的项目强加的。)

一种方法是将 SQLite3 table 转储到临时 CSV 文件,然后使用 Oracle 的 LOAD DATA INFILE 命令读取 CSV 文件。

我正在寻找一种方法来实现避免创建中间临时文件的相同最终结果。

更具体地说,因为我可以将 SQLite3 tables 批量读取到内存中(使用简单的 SELECT 语句),我需要的是批量写入副本来转储 tables 从内存到 Oracle 数据库。


编辑: 这是一个周期性任务。要复制的最大 table 通常有 ~100K 行。

SQLite3 和 Oracle DB 表是否具有相同的架构?如果他们这样做了,那么你可以尝试像这个伪代码的等价物一样简单的东西

for table in sqlite3tables:
    (SELECT * FROM table)  ->  temptable
    for row in temptable
        INSERT row INTO oracletable

如果不同的数据库有不同的模式,那么您需要以更加定制的方式编写您的 SELECT 语句。

无论哪种情况,阅读 https://www.python.org/dev/peps/pep-0249/ 上的 Python 数据库 API 文档对于编写解决方案都非常有用。

由于这是两个不同的 "databases",您可能需要一个到 SQLLite 的连接来执行查询,另一个连接到 Oracle DB 以执行插入。

从 Python 应用程序中插入 Oracle DB 时,您应该使用 cx_Oracle 模块的 executemany() 方法:

data = [
    (60, "Parent 60"),
    (70, "Parent 70"),
    (80, "Parent 80"),
    (90, "Parent 90"),
    (100, "Parent 100")
]

cursor.executemany("""
        insert into ParentTable (ParentId, Description)
        values (:1, :2)""", data)

https://blogs.oracle.com/opal/efficient-and-scalable-batch-statement-execution-in-python-cx_oracle