背景
最近工作中经常会有测试、项目经理让我查一下生产问题,每次都要去数据库查半天,数据库是部署在客户内网的一个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目录下面,这个方法成功。。。该早点看文档的,
就是每次看英文文档看的想睡觉就下意识的拒绝。