【问题标题】:cx_Oracle with multiple Oracle client versions具有多个 Oracle 客户端版本的 cx_Oracle
【发布时间】:2016-09-09 02:34:49
【问题描述】:
我正在运行 Python 2.7,并在 linux 64 位操作系统上使用 cx_Oracle。我需要能够针对 11.2 或 12.1 Oracle 客户端运行,因为我无法确定哪个客户端将安装在已部署的目标上。我知道有针对每个 Oracle 客户端构建的 cx_Oracle。我如何确定该应用程序可以正常工作?我应该提到我正在使用 pyinstaller 来打包应用程序。是否有针对两个 Oracle 客户端构建的 cx_Oracle 版本,或者我需要有两个不同版本的应用程序...一个用于 11g,一个用于 12c 客户端?
【问题讨论】:
标签:
python
python-2.7
cx-oracle
【解决方案1】:
虽然理论上您应该能够构建 cx_Oracle 的 Oracle 11g 版本并将其与 Oracle 11g 和 Oracle 12c 客户端一起使用,但我不推荐它。如果您能够说服您的用户使用最简单的 Oracle 12c 即时客户端。该客户端能够毫无困难地访问 11g 和 12c 数据库。但如果这不可能,另一种选择如下:
1) 为 11g 和 12c 编译 cx_Oracle,并将两个副本放在名为(例如)cx_Oracle_11g.so 和 cx_Oracle_12c.so 的安装中。
2) 使用如下代码动态导入 cx_Oracle:
for version in ("11g", "12c"):
fileName = os.path.join(installDir, "cx_Oracle_%s.so" % version)
try:
module = imp.load_dynamic("cx_Oracle", fileName)
break
except ImportError:
pass
3) 以与以前相同的方式在任何需要的地方使用动态导入的模块。由于动态加载的模块名为 cx_Oracle,您应该能够以常规方式将其导入其他代码中,它会找到您动态加载的模块。
4) 使用 cx_Oracle 6.x,它同时支持任何 Oracle Client 11.2、12.1 和 12.2。