【问题标题】:ImportError when importing cx_Oracle with PyPy使用 PyPy 导入 cx_Oracle 时出现 ImportError
【发布时间】:2020-06-25 11:17:41
【问题描述】:

我之前使用 python 将多个查询传递给 Oracle 数据库,但脚本执行时间过长。所以我决定选择 PyPy 并使用 JIT 编译器而不是 CPython 解释器。我通过 apt 安装了 PyPy,然后使用以下命令编译了脚本:

pypy script_file.py

它返回以下错误:

import cx_Oracle
ImportError: No module named cx_Oracle

PyPy 不支持 cx_Oracle 还是我做错了什么?如果是,这是由于环境值的问题吗?如何正确设置?

感谢您的帮助!抱歉英语不好。

【问题讨论】:

  • 您可以查看here 以获得解决方案。
  • 这能回答你的问题吗? How to install/use cx_Oracle in PyPy
  • 当您pypy3 -mpip install cx_oracle 时会发生什么?它成功了吗? This issue 已关闭,所以它应该可以工作。您可能想在那里打开一个新问题,要求他们为 PyPy3 提供二进制轮子。
  • @БогданОпир 我早些时候看到了这个解决方案,但它不仅过时(从 2012 年开始),它不是我正在寻找的解决方案,因为对答案的一条评论提到它安装了旧版本的cx_Oracle 即使在 2012 年也已经过时,所以我猜它不会支持我正在使用的 python 3。不过,我会试试看。
  • @mattip 谢谢!我通过安装 pypy3 并使用它的 pip 安装 cx_oracle 然后使用 pypy3 而不是 python 执行脚本来让它工作。您可以发表您的评论作为答案。

标签: python oracle cx-oracle pypy


【解决方案1】:

不管 PyPy 支持如何,与 Oracle 数据库的每个连接仍然一次只能执行一条语句。您可以坚持使用 CPython 并查看其他架构,例如打开 multiple connections。还要调整您的查询并调整 cx_Oracle 获取数据的方式,例如。使用arraysize 和(cx_Oracle 8 中的新功能)prefetchrows。请参阅 cx_Oracle 手册部分Tuning cx_Oracle

【讨论】:

  • 好吧,我想我应该提一下我正在做的事情。基本上,我的任务是将 PL SQL 过程转换为 python。我正在做的是连接到数据库,并通过 .execute() 方法传递查询,并在 python 中实现 if else 循环和任何中间变量的逻辑。但是,我感觉我提到的性能问题是由于我传递了非常大(几乎 100-200 行)的查询,这些查询需要很长时间才能执行。等效的 PL SQL 代码需要 2-3 秒才能执行,而我的 python 实现...
  • ...大约需要 30 秒。所以这就是我想问的:cx_Oracle 对于极长和深度嵌套的查询是否不可行?我已经使用了 cx_Oracle 的调整部分中提到的一些优化,例如绑定变量,但最后,我认为优化不足以从我的 python 运行时缩短 25-28 秒来制作我的 python基于解决方案可行。
  • 对我来说听起来不像是合乎逻辑的结论。请保持您的原始帖子更新信息。并分享有关您正在做什么的实际细节(例如,通过查询,您是指 SELECT 还是您是松懈并意味着另一种陈述。将 PL/SQL 转换为 Python 的主要前提也听起来“错误” - 为什么要打扰? 为什么要将负载和数据移出数据库服务器?
  • 通过查询,我指的是各种SELECT、INSERT INTO、DELETE查询。我是一名实习生,我的主管告诉我,如果我可以用 python 替换 PL/SQL 函数,数据库后端会更快。因此,在 PL/SQL 函数中,每当我遇到 SELECT、INSERT INTO、DELETE 查询时,我都会在执行方法中传递它,而当我遇到 if else 或循环时,我会在 python 中实现该逻辑。
  • 虽然在某些情况下处理数据库外的数据更好,但在许多情况下,将数据移入和移出数据库的成本很高。如果您将 PL/SQL 块拆分为单独的语句,那么您最终会在所有数据传输之上进行更多的往返(对于每个语句)。您必须根据自己的环境(数据大小、网络成本等)进行评估。在纯 cx_Oracle 方面,请查看 cx_Oracle 手册Tuning cx_Oracle。使用executemany()arraysize 等最佳功能。
猜你喜欢
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 2014-08-01
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多