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

2023-12-20

我有大约 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 文件中读取数据。


如果你的数据已经在Python中,那么使用executemany() http://cx-oracle.readthedocs.io/en/latest/cursor.html#Cursor.executemany。在您有如此多行的情况下,您可能仍然会执行多个调用来插入批量记录。

更新:请参阅 cx_Oracle 文档批量语句执行和批量加载 https://cx-oracle.readthedocs.io/en/latest/user_guide/batch_statement.html.

更新 2:cx_Oracle 的最新版本(已更名为python-oracledb https://cjones-oracle.medium.com/open-source-python-thin-driver-for-oracle-database-e82aac7ecf5a)默认情况下以“精简”模式运行,绕过 Oracle 客户端库。这意味着在许多情况下数据加载速度更快。的用途和功能executemany()新版本中还是一样。安装类似的东西python -m pip install oracledb。这是当前的文档执行批量语句和批量加载 https://python-oracledb.readthedocs.io/en/latest/user_guide/batch_statement.html。另请参阅升级文档 https://python-oracledb.readthedocs.io/en/latest/user_guide/appendix_c.html#upgrading-from-cx-oracle-8-3-to-python-oracledb.

以下是使用 python-oracledb 命名空间的示例。如果您仍然使用 cx_Oracle,则更改import to be import cx_Oracle as oracledb:

import oracledb
import csv

...
Connect and open a cursor here...
...

# Predefine the memory areas to match the table definition.
# This can improve performance by avoiding memory reallocations.
# Here, one parameter is passed for each of the columns.
# "None" is used for the ID column, since the size of NUMBER isn't
# variable.  The "25" matches the maximum expected data size for the
# NAME column
cursor.setinputsizes(None, 25)

# Adjust the number of rows to be inserted in each iteration
# to meet your memory and performance requirements
batch_size = 10000

with open('testsp.csv', 'r') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    sql = "insert into test (id,name) values (:1, :2)"
    data = []
    for line in csv_reader:
        data.append((line[0], line[1]))
        if len(data) % batch_size == 0:
            cursor.executemany(sql, data)
            data = []
    if data:
        cursor.executemany(sql, data)
    con.commit()

正如其他人指出的:

  • 避免在语句中使用字符串插值,因为它存在安全风险。 这通常也是一个可扩展性问题。使用绑定变量。当您需要对列名称等内容使用字符串插值时,请确保对所有值进行清理。
  • 如果数据已经在磁盘上,那么使用 SQL*Loader 或 Data Pump 之类的东西会比将其读入 cx_Oracle 然后将其发送到数据库更好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用Python向Oracle数据库插入100万行? 的相关文章

随机推荐

  • 将 XML 数组转换为 XML 时出现奇怪的文本

    我使用这个问题的答案将 XML 数组转换为单个 XML 输出 将 XML 数组输出为纯 XML https stackoverflow com questions 2554671 output array of xml to plain x
  • 为什么这个救援语法有效?

    好的 我正在使用的应用程序有这种方法 并且它可以在生产中使用 我的问题为什么这有效 这是新的 Ruby 语法吗 def edit load elements current user unless current user role adm
  • AWS Elastic Beanstalk 中的自定义 URL

    AWS Elastic Beanstalk 建议使用以下格式的 URL https appname elasticbeanstalk com 但我需要将其更改为我自己的网址 例如https tarta ai 怎么做 Note 我的域使用 A
  • 如何在GDB中像数组一样查看指针?

    假设定义 int a 100 Type print a然后 gdb 会自动将其显示为数组 1 2 3 4 然而 如果a作为参数传递给函数 那么gdb会将其视为普通的int指针 类型print a将显示 int 0x7fffffffdaa0
  • 如何在UI底部的固定位置设置一个按钮?

    我希望一个按钮始终出现在 UI 页脚的固定位置 总是 无论它上面是否有组件 请在您的主布局下选择一个相对布局 将其高度和宽度设置为填充父项 并将其重力设置为底部 然后将任何文本视图或任何您想要的按钮放入其中
  • setup.py - 安装后将模块符号链接到 /usr/bin

    我几乎完成了 python 包的开发 并且还使用 distutils 编写了基本的 setup py usr bin env python author Prahlad Yeri description Small daemon to cr
  • 在外部 JavaScript 文件中使用 KnockoutJS ViewModel

    如何在外部 JS 文件中创建 KO JS ViewModel 然后在 html 文件中使用它 这看起来是一件很简单的事情 但我无法让它工作 也找不到任何关于如何做到这一点的明确信息 如果我忽略了 我会道歉 如果有人能指出我的答案 我会删除它
  • 使用字段数将文件拆分为更小的文件

    我很难将一个大的 50GB csv 文件分解成更小的部分 每行有几千个字段 一些字段是双引号中的字符串 其他字段是整数 小数和布尔值 我想逐行解析文件并按每行中的字段数进行分割 字符串可能包含多个逗号 例如 以及许多空字段 1 30 50
  • Delphi 2007 和 Logitech 网络摄像头驱动程序

    不久前 我遇到了 Delphi 2007 在 Logitech 网络摄像头驱动程序运行时无法运行和调试应用程序的问题 显然 罗技驱动程序会在每个正在运行的进程中插入一个存根 从而弄乱调试器的偏移量 已经一年多了 这仍然是一个问题吗 罗技是否
  • 如何在不调用 java.lang.String 的情况下检查 clojure 中字符串的相等性?

    clojure 有没有办法检查字符串的相等性 即我需要知道它们的内容是否相等 而不是位置 thanks Clojure 中的平等 函数 总是测试值 而不是身份 所以两个字符串是 如果它们有相同的内容 对于大多数 Java 类型 包括 Str
  • 使用 MongoDB 代替 MS SQL Server 的优点和缺点 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 NoSQL 世界的新手 正在考虑将 MS Sql Server 数据库替换为 MongoDB 我
  • 如何在 build.gradle 中检索 ADB 的路径

    我尝试通过启动应用程序gradle task task runDebug dependsOn installDebug run task run type Exec commandLine adb shell am start n com
  • 使用附加值扩展枚举

    延长期限的常见做法是什么enum在C语言中 我有enum来自其他包含的内容 并希望用一些值来扩展它们 希望以下示例能够为我想要实现的目标提供直观的信息 include
  • std::thread 不是使用 Eclipse Kepler MinGW 的命名空间 std 的成员

    我正在尝试编译一个简单的 C 程序 该程序在 eclipse kepler mingw 4 8 1 和 win32 上使用 std thread 我希望在多年的 Windows 开发之后 有一天能将开发转移到 Linux include t
  • 如何在c中使用fread()读取结构体的内容

    我有以下代码 我试图读取文件的内容并显示它并写入另一个文件 我的问题是我在屏幕上看到的内容与文件的内容完全不同 我已经把文件的部分内容和显示的结果的部分 include
  • CDN 库在 Chrome 中被屏蔽

    我在网站上使用传单 OSM 制作小地图 该网站本身可通过 HTTPS 访问 而传单库 据我所知 只能通过 HTTP 连接检索 现在 Chrome 不包含该库 并在控制台中显示以下消息 blocked The page at https ex
  • VBA计算数组的非空元素

    菜鸟问题 我想计算数组的非空元素 我的尝试 Dim Arr 1 To 15 As Double populating some of the elements of Arr Dim nonEmptyElements As Integer i
  • Android 中的 AdMob“AdView 缺少必需的 XML 属性‘adSize’”

    我正在尝试在我的应用程序中实施 AdMob 但不知道它以某种方式显示此错误 并且我的 R java 文件因此没有生成 我已经尝试了所有方法来解决这个问题 例如 Clean Build Build All 但非对我有用 按照我的代码片段 其中
  • 自定义类型作为主键

    我目前正在 Visual Studio 2015 上使用 EF6 代码优先 我正在开发一个数据库 我想使用用户定义的类型作为主键 这是我想要的一个简单示例 public class ObjectIdType public string id
  • 如何使用Python向Oracle数据库插入100万行?

    我有大约 100 000 到 1 000 000 行要插入到 Oracle18c 数据库中 我对 Oracle 和这种数量级的数据还很陌生 我认为必须有一些最佳的方法来做到这一点 但现在我只能实现逐行插入 def insertLines c