如何使用 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 进行插入。
我有大约 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 进行插入。