使用 python 从 Linux 服务器连接到 Oracle 数据库 (lxv)

Connect to Oracle database using python from a Linux server (lxv)

在我的本地机器上

我在 python 中创建了一个脚本,用于从 Oracle 数据库中检索数据。 使用 cx_Oracle:

连接到数据库
con = cx_Oracle.connect (username, password, dbService)

当使用 SQL 开发人员时,连接是使用 自定义 JDBC.

建立的

在 Linux 服务器上复制程序。

当我尝试按原样执行 python 脚本时,出现以下错误。

cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or directory". See https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html for help

我认为问题出在 Oracle 路径,而不是 python 预期的路径。因此,我添加了这行额外的代码,用于指出 Oracle 库所在的路径。

cx_Oracle.init_oracle_client(lib_dir=r"/apps/oracle/product/19.3.0/lib")

这会导致另一个错误:

cx_Oracle.DatabaseError: Error while trying to retrieve text for error ORA-01804

有什么线索吗?

cx_Oracle initialization doc 指出 Linux init_oracle_client() 并没有真正按照您的想法行事。在 Python 进程启动之前,您仍必须设置系统库搜索路径以包含 Oracle 库。

我理解正确吗 Python 的机器既安装了数据库又安装了 Instant Client?

如果您希望 Python 使用 Instant Client 库,请将 LD_LIBRARY_PATH 设置到它的位置并执行 not set ORACLE_HOME .

如果您在 Python 的机器上安装了完整的 Oracle DB,则可以删除 Instant Client。在开始 Python 之前,您需要设置 ORACLE_HOME、LD_LIBRARY_PATH 以及任何其他需要的设置 - 通常 运行 source /usr/local/bin/oraenv。这应该将系统库搜索路径设置为包含 /apps/oracle/product/19.3.0/lib 。像这样的代码片段(未经测试)可能会有所帮助:export ORACLE_SID=ORCLCDB;set ORAENV_ASK=NO; source /usr/local/bin/oraenv。确保 Python 进程具有对 ORACLE_HOME 目录的读取权限。

cx_Oracle installation guide 讨论了这一切。

ORA-1804 消息指出了我的问题的答案。

根据 Oracle 初始化文档:https://cx-oracle.readthedocs.io/en/latest/user_guide/initialization.html#usinginitoracleclient

Note if you set lib_dir on Linux and related platforms, you must still have configured the system library search path to include that directory before starting Python.

On any operating system, if you set lib_dir to the library directory of a full database or full client installation, you will need to have previously set the Oracle environment, for example by setting the ORACLE_HOME environment variable. Otherwise you will get errors like ORA-1804. You should set this, and other Oracle environment variables, before starting Python, as shown in Oracle

即使定义 ORACLE_HOME 应该在开始 Python 之前完成(根据 Oracle 文档),也可以通过修改 python 脚本本身来完成。所以在oracle客户端初始化命令之前必须添加以下命令:

import os
# Setup Oracle paths 
os.environ["ORACLE_HOME"] = '/apps/oracle/product/19.3.0'
os.environ["ORACLE_BASE"] = '/apps/oracle'
os.environ["ORACLE_SID"] = 'orcl'
os.environ["LD_LIBRARY_PATH"] = '/apps/oracle/product/19.3.0/lib'

import cx_Oracle
# Initialize Oracle client
cx_Oracle.init_oracle_client(lib_dir=r"/apps/oracle/product/19.3.0/lib")