【问题标题】:Bulk inserts into Oracle database via Python's jaydebeapi通过 Python 的 jaydebeapi 批量插入 Oracle 数据库
【发布时间】:2019-06-19 01:31:26
【问题描述】:

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

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

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

更具体地说,由于我可以将 SQLite3 表批量读取到内存中(使用简单的SELECT 语句),因此我需要批量写入对应项,以便将表从内存转储到 Oracle 数据库中。


编辑:这是一个经常性的任务。要复制的最大表通常有大约 100K 行。

【问题讨论】:

  • 这是一次性交易吗?多少行?
  • @OldProgrammer:我已经编辑了我的帖子来解决你的问题。

标签: python oracle jaydebeapi


【解决方案1】:

由于这是两个不同的“数据库”,您可能需要连接到 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

【讨论】:

    【解决方案2】:

    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 文档对于帮助编写解决方案都非常有用。

    【讨论】:

      猜你喜欢
      • 2012-11-11
      • 2018-08-15
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多