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

时间:2019-04-24 06:36:02

标签: python-3.x ubuntu-18.04 cx-oracle

我正在使用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()

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

  

文件“ script.py”,第13行,在       连接= cx_Oracle.connect(“用户名/密码@主机/端口”)cx_Oracle.DatabaseError:DPI-1047:无法找到64位Oracle   客户端库:“ libclntsh.so:无法打开共享库文件:否这样   文件或目录”。请参阅   https://oracle.github.io/odpi/doc/installation.html#linux寻求帮助

5 个答案:

答案 0 :(得分:1)

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

  • 首先,我下载了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

答案 1 :(得分:1)

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

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

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

这是修复。导入操作系统模块并添加以下代码。

os.environ["ORACLE_HOME"] = "你的 oracle 库"。就我而言,它是 /u01/oracle/product/12.1.0.2/

答案 2 :(得分:0)

经过更多研究,我从ubunu community获得了解决方案,在安装oracle Instantclient之后,您将必须按以下方式集成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 intantclient版本,例如11.2、12.2
连接参数应如下connection = cx_Oracle.connect("username/password@host/service_name e.g orcl")

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

SQL> show parameter local_listener

值是侦听器

答案 3 :(得分:0)

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

答案 4 :(得分:0)

对于Ubuntu Linux 20.04 LTS服务器,对我有用的(可能很明显,但对我而言不是!)是1)执行导出时,您需要位于要运行app /命令的文件夹中在从SSH终端关闭到EC2服务器后,从该服务器连接到Oracle,尽管这可行,但是仍然无法使用,此问题已解决,方法是2)将其添加到〜/ .bashrc中 完整步骤:

使用Oracle Instant Client解压缩时,例如:/ 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

我的矿山按预期方式安装在EC2服务器上,并以“ ubuntu”用户身份安装了必需的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);
            }
        }
    }
};