How to fix: cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library - Python

How to fix: cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library - Python

我正在使用 cx_oracle 7 和 python 3.6.7 建立到远程服务器中的 oracle 11g 的连接。我的 OS 在 Ubuntu 18.04

我已经使用 libclntsh.so 安装了 oracle 即时客户端库,但我没有得到预期的输出。

这是我用来连接到 Oracle 数据库的代码

connection = cx_Oracle.connect("username/password@host/port")
print (connection.version)
connection.close()

当脚本运行时,我希望获得连接版本而不是我收到以下错误消息

File "script.py", line 13, in connection = cx_Oracle.connect("username/password@host/port") cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "libclntsh.so: cannot open shared object file: No such file or directory". See https://oracle.github.io/odpi/doc/installation.html#linux for help

经过更多研究,我从 Ubuntu community 得到了解决方案,在安装 oracle instant-client 之后,您将必须按如下方式集成 oracle 库:

export LD_LIBRARY_PATH=/usr/lib/oracle/<version>/client(64)/lib/${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}

An example for 12.1 version for Linux x86_64 can be:

export LD_LIBRARY_PATH=/usr/lib/oracle/12.1/client64/lib/${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}

其中 <version> 表示您的 oracle 即时客户端的版本,例如 11.2、12.2
连接参数应该如下

connection = cx_Oracle.connect("username/password@host/service_name e.g orcl")

要获取 listener/service_name 在 oracle sqlplus

中键入以下内容
SQL> show parameter local_listener

VALUE 下的文字是您的 listener/service_name。

我遇到了完全相同的问题。这对我有用:

  • 首先,我下载了 Oracle Basic zip file。就我而言,我得到的是 64 位版本。
  • 之后,我将其解压缩到opt 目录中。我不得不在我的系统中使用 sudo
    $ sudo mkdir -p /opt/oracle  

    $ cd /opt/oracle  

    $ sudo unzip /opt/oracle/instantclient-basic-linux.x64-19.8.0.0.0dbru.zip  
  • 然后我安装了libaio1。请注意,我正在使用 Ubuntu
    $ sudo apt-get install libaio1
  • 最后,我添加了外部变量的路径LD_LIBRARY_PATH
    $ vim ~/.bashrc  
  • 并将此行添加到 .bashrc 文件
    export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_8:$LD_LIBRARY_PATH  
  • 保存 .bashrc 文件后,我获取了它:
    $ source ~/.bashrc

然后我的 Python 脚本再次运行良好。

另见 cx_oracle documentation

如果您正在使用 aws lambdas 连接到您的 RDS/OracleDB,请尝试使用 Docker 的这种方法来自动构建 aws lambda 层 - https://medium.com/@sabithvm/building-up-on-lambda-layers-a4771d3b9c7

对于 Ubuntu Linux 20.04 LTS 服务器,对我有用的(这可能很明显但对我来说不是!)是 1) 当您执行导出时,您需要在您打算 运行 从中连接到 Oracle 的应用程序/命令的文件夹,虽然这有效,但在关闭到 EC2 服务器的 SSH 终端后,然后再次不可用,这由 2) 解决)将其添加到 ~/ .bashrc文件 完整步骤:

以 Oracle 即时客户端为例:/opt/oracle/instantclient_19_9

sudo apt-get install libaio1
cd ~/your-project-folder
export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_9

然后我添加到 ~/.bashrc 中:

sudo nano ~/.bashrc

并添加这一行:

export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_9

并在终端中 运行:

source ~/.bashrc

我的安装在 'ubuntu' 用户下的 EC2 服务器上按预期工作,安装了必要的 nvm/nodeJs

在 nodeJs 中,示例连接可能类似​​于:

const testOracleConnection = async () => {
    let conn;

    try {
        conn = await oracledb.getConnection(oracleConfig);

        const query1 = 'select ID, anotherColumn from someTable where ID = 1111';

        const result = await conn.execute(query1);

        console.log(result);
    } catch (err) {
        console.error(err);
    } finally {
        if (conn) {
            try {
                await conn.close();
            } catch (err) {
                console.error(err);
            }
        }
    }
};

这个错误我都快放弃了。我可能尝试了互联网上的所有解决方案,但没有任何效果。

我在 Unix 中编写了一个类似的脚本,但遇到了同样的错误。我已经应用了我在 shell 脚本中使用的相同修复程序,并且效果很好。

如果我直接执行 Python 脚本,则可以通过 cx_Oracle 访问数据库。但是当我通过 crontab 安排它时,我不断收到错误消息“cx_Oracle.DatabaseError: DPI-1047”

这里是修复。导入 OS 模块并添加以下代码。

os.environ["ORACLE_HOME"] = "你的 oracle 库 "。在我的例子中是 /u01/oracle/product/12.1.0.2/