使用python登录远程Oracle 19c数据库
测试需求:
oracle数据库安装在linux PC1上,想要在另外一台Linux PC2上跑python脚本登录oracle数据库
Linux PC1配置环境:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
CentOS Linux release 7.8.2003 (Core)
Linux PC2配置环境:
CentOS Linux release 7.7.1908 (Core)
python3.6
安装配置环境
- 下载cx-Oracle
安装命令 pip3 install cx-Oracle
如果没有安装pip3,使用yum install python3-pip
- 下载Oracle Instant Client
想要连接远程oracle数据库必须要安装Oracle Instant Client。从cx_Oracle说明文档可以看到,要连接远程oracle数据库需要Oracle Client libraries,这个可以从Oracle Instant Client获取。
Oracle Instant Client下载地址https://www.oracle.com/database/technologies/instant-client/downloads.html
本地下载版本instantclient-basic-linux.x64-19.8.0.0.0dbru.zip
上传到linux PC2解压
unzip instantclient-basic-linux.x64-19.8.0.0.0dbru.zip
进入解压路径 network/admin
[root@abc admin]# pwd
/root/server/instantclient_19_8/network/admin
[root@abc admin]# ls
README tnsnames.ora
新建tnsnames.ora文件,添加oracle数据库信息,具体内容可以参考linux PC1上oracle数据库的tnsnames.ora文件(路径为Oracle安装路径network/admin下)
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.180.149.209)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
主要确保数据名称,HOST的IP地址正确。
- 安装libaio
sudo yum install libaio
有些linux叫libaio1, 如果是Oracle Linux 8安装libnsl
- 添加动态链接
把解压的instantclient_19_8文件夹路径添加动态链接
[root@abc instantclient_19_8]# pwd
/root/server/instantclient_19_8
[root@abc instantclient_19_8]# sh -c "echo /root/server/instantclient_19_8 > /etc/ld.so.conf.d/oracle-instantclient.conf"
[root@abc instantclient_19_8]# ldconfig
- 修改环境变量LD_LIBRARY_PATH
把解压的instantclient_19_8文件夹路径添加到LD_LIBRARY_PATH
[root@abc instantclient_19_8]# export LD_LIBRARY_PATH=/root/server/instantclient_19_8:$LD_LIBRARY_PATH
如果不执行第4,5步,直接连接数据库会报
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".
登录数据库
输入用户名密码,测试登录成功
[root@abc instantclient_19_8]# python3
Python 3.6.0 (default, May 20 2019, 15:40:25)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
>>> conn = cx_Oracle.connect('user/[email protected]:1521/ORCL')
>>> conn.close()
之前琢磨了好久都报错,还是在cx_Oracle的官方指导下才找到的解决方法,附上链接
参考链接:https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html