通过 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
我想将数据从 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