如何使用Python将一百万行插入Oracle数据库?

时间:2019-03-20 23:29:23

标签: python database oracle insert oracle18c

我有大约100,000至1,000,000行要插入到Oracle18c数据库中。我对Oracle和这种数量级的数据非常陌生。我认为必须有一些最佳的方法来完成此操作,但是到目前为止,我仅设法实现了逐行插入:

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

Oracle中是否有一些清晰的方法可以使用cx_Oracle(Python Oracle库)将行进行批量处理以提高有效性?

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

3 个答案:

答案 0 :(得分:2)

我不知道您的数据采用哪种格式,但是SQL Data Loader是一个命令行实用程序,专门用于向Oracle添加大量数据。

答案 1 :(得分:1)

如果您的数据已经在Python中,请使用executemany()。对于有这么多行的情况,您可能仍将执行多次调用以插入一批记录。参见https://blogs.oracle.com/opal/efficient-and-scalable-batch-statement-execution-in-python-cx_oracle

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然后再将其发送到DB更好。

答案 2 :(得分:1)

就性能和简便性而言,最佳的方法是在CSV文件上创建一个外部表,然后使用SQL进行插入。