Deeping中使用python连接Oralce报错:Cannot locate a 64-bit Oracle Client library: "./instantclient_21_1/libclntsh.so: file too short"

背景

最近工作中经常会有测试、项目经理让我查一下生产问题,每次都要去数据库查半天,数据库是部署在客户内网的一个Oracle数据库,
个人对于Oracle数据库的存储过程不太熟悉,于是想着写个Python脚本方便以后排查问题。网上搜到目前Python连接Oracle数据库
最好用的库是cx_Oracle,结果第一句代码报错就搞了半天_-_

本文所述系统及工具版本

操作系统:Deepin GNU/Linux 20.2
python版本:3.8.5
oralce instantclien版本:instantclient_21_1

代码及错误堆栈

代码

import cx_Oracle
import os


def connect_oracle():
    # 加载oracle客户端
    cx_Oracle.init_oracle_client(lib_dir="./instantclient_21_1")

    # 连接数据库
    db = cx_Oracle.connect('test', 'testpassword', '127.0.0.1:1521/testdb')
    cur = db.cursor()
    result = cur.execute("SELECT * FROM test_table tt WHERE tt.number = 10")
    for i in result:
        print(i)


if __name__ == "__main__":
    connect_oracle()

错误堆栈

问题解决过程

1.刚开始以为是文件夹或文件的权限问题,毕竟linux系统中权限问题涉及的是很多的,于是给instantclient_21_1增加读写权限,没用;
2.后来以为是绝对路径的问题,于是将instantclient_21_1移到python程序的目录下,使用相对路径,没用;
3.网上搜索,尝试了几种方案,设置了Oracle的一些环境变量之类的,没用;
4.老老实实跟着错误提示里面的链接去看cx_Oracle的安装文档:

cx_Oracle安装文档
直接看linux的部分:https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html#installing-cx-oracle-on-linux
安装第四步:

如果机器上没有Oracle软件将会受到影响,要求我们持久化instantclient的路径到运行连接里面,执行下面的代码即可:

sudo sh -c "echo /opt/oracle/instantclient_21_1 > /etc/ld.so.conf.d/oracle-instantclient.conf"
sudo ldconfig

为了确保和文档上完全一致,我最后也把instantclient_21_1这个文件夹已到了/opt/oracle目录下面,这个方法成功。。。该早点看文档的,
就是每次看英文文档看的想睡觉就下意识的拒绝。

posted @ 2021-06-27 00:13  小白一只726  阅读(1519)  评论(0编辑  收藏  举报