如何修复:cx_Oracle.DatabaseError:DPI-1047:无法找到64位Oracle Client库-Python

Ian*_*ato 5 cx-oracle python-3.x ubuntu-18.04

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

我已经用libclntsh.so安装了Oracle Instant Client库,但没有得到预期的输出。

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

connection = cx_Oracle.connect("username/password@host/port")
print (connection.version)
connection.close()
Run Code Online (Sandbox Code Playgroud)

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

文件“ script.py”,第13行,连接= cx_Oracle.connect(“ username / password @ host / port”)cx_Oracle.DatabaseError:DPI-1047:无法找到64位Oracle Client库:“ libclntsh.so:无法打开共享对象文件:没有这样的文件或目录。请参阅 https://oracle.github.io/odpi/doc/installation.html#linux获取帮助

Mik*_*tos 18

我面临着完全相同的问题。这对我有用:

  • 首先,我下载了 Oracle Basic zip 文件。就我而言,我得到的是 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  
Run Code Online (Sandbox Code Playgroud)
  • 然后我安装了libaio1。请注意,我正在使用 Ubuntu
    $ sudo apt-get install libaio1
Run Code Online (Sandbox Code Playgroud)
  • 最后,我添加了外部变量的路径LD_LIBRARY_PATH
    $ vim ~/.bashrc  
Run Code Online (Sandbox Code Playgroud)
  • 并将这一行添加到.bashrc文件中
    export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_8:$LD_LIBRARY_PATH  
Run Code Online (Sandbox Code Playgroud)
  • 保存.bashrc文件后,我获取了它:
    $ source ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

然后我的 Python 脚本又可以正常工作了。

另请参阅cx_oracle 文档


Ian*_*ato 16

经过更多研究,我从Ubuntu 社区获得了解决方案,在您安装了 oracle 即时客户端后,您必须按如下方式集成 oracle 库:

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

Linux x86_64 12.1 版本的示例可以是:

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

其中<version> 表示你的oracle Instant-client的版本,例如11.2、12.2
连接参数应该如下

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

要获取侦听器/服务名称,请在 oracle sqlplus 中键入以下内容

SQL> show parameter local_listener
Run Code Online (Sandbox Code Playgroud)

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

  • 对于安装 Oracle Instant Client,我建议您遵循此[指南](https://oracle.github.io/odpi/doc/installation.html)(下载一个包并将其解压缩到 /opt/oracle/ 中)。另外,我认为最好添加[永久路径](/sf/answers/1887357601/) (3认同)

Lei*_*son 6

对于 Ubuntu Linux 20.04 LTS 服务器,对我有用的(这可能很明显,但对我来说不是!)是 1)当您执行导出时,您需要在您打算运行连接到 Oracle 的 app/ 命令的文件夹中从,虽然这有效,但在关闭到 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
Run Code Online (Sandbox Code Playgroud)

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

sudo nano ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

并添加这一行:

export LD_LIBRARY_PATH=/opt/oracle/instantclient_19_9
Run Code Online (Sandbox Code Playgroud)

并在终端运行:

source ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

我的安装在“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);
            }
        }
    }
};
Run Code Online (Sandbox Code Playgroud)