如何使用 Python 向 Oracle 数据库中插入 100 万行?

How to insert 1 million rows into Oracle database with Python?

我有大约 100,000 到 1,000,000 行要插入到 Oracle18c 数据库中。我对 Oracle 和这个数量级的数据还很陌生。我认为一定有一些最佳的方法来做到这一点,但现在我只能设法实现逐行插入:

def insertLines(connection, table_name, column_names, rows):
    cursor = connection.cursor()
    if table_exists(connection, table_name):
        for row in rows:
            sql = 'INSERT INTO {} ({}) VALUES ({})'.format(table_name, column_names, row)
            cursor.execute(sql)
    cursor.close()

在 Oracle 中是否有一些明确的方法来使用 cx_Oracle(python Oracle 库)来批量处理行以达到更高的效率?

编辑:我从 CSV 文件中读取数据。

我不知道你的数据是什么格式,但SQL Data Loader是一个专门为向 Oracle 添加大量数据而创建的命令行实用程序。

如果您的数据已经在 Python 中,则使用 executemany(). In your case with so many rows, you probably would still execute multiple calls to insert batches of records. See https://blogs.oracle.com/opal/efficient-and-scalable-batch-statement-execution-in-python-cx_oracle

更新:请参阅新的 cx_Oracle 文档 Batch Statement Execution and Bulk Loading

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)

正如其他人指出的那样

  • 避免在语句中使用字符串插值,因为它存在安全风险。 这通常也是一个可扩展性问题。使用绑定变量。在需要对列名称等内容使用字符串插值的地方,请确保对所有值进行清理。
  • 如果数据已经在磁盘上,那么使用 SQL*Loader 或 Data Pump 之类的东西比将其读入 cx_Oracle 然后发送到数据库更好。

就性能而言最理想且最简单的方法是在您的 CSV 文件上创建外部 Table,然后使用 SQL 进行插入。