【问题标题】:'Multi' method is not allowed when loading data to Oracle database with sqlalchemy使用 sqlalchemy 将数据加载到 Oracle 数据库时,不允许使用“Multi”方法
【发布时间】:2020-05-13 17:44:00
【问题描述】:

我正在使用 sqlalchemy 和 pandas 将数据框加载到 Oracle 数据库。由于'multi'方法允许批量上传,我选择了该方法。我的熊猫版本是 1.0.1。但是我得到如下错误:

具有当前数据库版本设置的“oracle”方言不支持就地多行插入。

from sqlalchemy import create_engine
oracle_connection_string = (
'oracle+cx_oracle://{username}:{password}@' +
cx_Oracle.makedsn('{hostname}', '{port}', service_name='{service_name}'))

engine = create_engine(oracle_connection_string.format(
    username='abc',
    password='123',
    hostname='bcd',
    port='1234',
    service_name='xyz.com',fast_executemany=True))
cleandata.to_sql('table', con = engine,schema = 'ht', if_exists='replace',index = False, method = 'multi')

到目前为止,我没有看到任何有相同问题的帖子。你知道如何解决这个问题吗? P.s:当我消除方法 multi 时,代码有效。但是对于 10 条记录,运行需要 2 分钟。那代价太大了。我的表将有 4000 条记录。这就是为什么我在 Python 上寻找快速加载方法的原因。谢谢!

【问题讨论】:

  • Oracle 客户端库和 Oracle DB 的版本是什么? FWIW,批量加载的 cx_Oracle 文档是 here,如果您需要使用原始 cx_Oracle。
  • 我将批量加载作为附加文档进行。事实上,它减少了 95% 的时间。我会坚持建议。谢谢

标签: python oracle sqlalchemy etl


【解决方案1】:

正如 Chris 提到的,我使用了来自 here 的批量加载。

> cursor.executemany("insert into Table values (:1, :2)", dataToInsert')

效果很好。在上传记录数相同的情况下,我从 120 秒缩短了 95% 到 5 秒。

【讨论】:

  • 有趣的是,这是必需的,因为我认为 pandas+sqla 应该默认使用 executemany 以及它所有的底层。
  • @IljaEverilä 我也面临类似的问题,这是否意味着由于 cx_oracle 中的一些限制,sqlalchemy 不能支持 oracle 的多插入?
  • 是的 sql+pandas 应该跑得更快。我在不同的论坛上阅读了许多帖子。到目前为止,他们提到了 fast_executemany 以促进上传过程。但它对我不起作用
  • fast_executemany 选项适用于 pyodbc 驱动程序。 @chidori 不幸的是,我对 Oracle 或 SQLA 的方言实现不够熟悉,无法回答这个问题。
猜你喜欢
  • 2015-04-11
  • 1970-01-01
  • 2013-07-01
  • 2015-10-02
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
相关资源
最近更新 更多