Python通过Oracle客户端连接数据库

张彤 2022年06月11日 40次浏览

安装包

  •  Anaconda3-2019.10-Linux-x86_64.sh
  •  oracle Version 11.2.0.4.0 client for centos 64-bit
  •  SQLPlus: Additional libraries and executable for running SQLPlus with Instant Client

注意,python连接Oracle有一个非常苛刻的条件,就是你的python版本,系统版本,目标端的数据库,都必须是一样的位,一般都是64BIT,32位同学想办法改吧!

创建连接用户

adduser dwzyywzt
passwd dwzyywzt

# 变更权限,可写
chmod -v u+w /etc/sudoers

vi /etc/sudoers
-------------------------------------------------------
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
dwzyywzt    ALL=(ALL)       ALL (添加这一行)
-------------------------------------------------------
# 撤销权限
chmod -v u-w /etc/sudoers 

安装python-conda

# 默认软件上载位置是/mnt
cd /mnt/

# 赋权
chown dwzyywzt:dwzyywzt Anaconda3-2019.10-Linux-x86_64.sh

su - dwzyywzt
chmod +x Anaconda3-2019.10-Linux-x86_64.sh

./Anaconda3-2019.10-Linux-x86_64.sh

进入安装界面,按回车看安装须知

# 记得一定要用sudo 不然路径权限会报错
[dwzyywzt@localhost mnt]$ sudo bash Anaconda3-2019.10-Linux-x86_64.sh 

Welcome to Anaconda3 2019.10

In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue

一直回车直到yes or no,写yes

Do you accept the license terms? [yes|no]
[no] >>> 
Please answer 'yes' or 'no':'
>>> yes

接下来,会叫你选择安装路径,我们手动选择/mnt/anaconda3

Anaconda3 will now be installed into this location:
/home/dwzyywzt/anaconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

[/home/dwzyywzt/anaconda3] >>> /mnt/anaconda3

安装oracle 客户端

oracle客户端下载网址

使用如下语句,查看需要连接的Oracle数据库版本

select *
from v$version;

11g edition release 11.2.0.4.0-64bit production

所以选择 Version 11.2.0.4.0的版本进行下载。我们选择Base版本下载。

  • 下载的时候,需要注册一个Oracle账户,非常快速就可以注册完成了。
  • Basic: All files required to run OCI, OCCI, and JDBC-OCI applications

下载完毕后,通过xftp上载到/mnt目录下

# 赋权
chown dwzyywzt:dwzyywzt instantclient-basic-linux.x64-11.2.0.4.0.zip

# 解压
cd /mnt/package
unzip instantclient-basic-linux.x64-11.2.0.4.0.zip 
cd /mnt/package/instantclient_11_2/
ln -s libclntsh.so.11.1 libclntsh.so
# 如果软链错误,需要删除
rm libclntsh.so -y
# 继续加软链
ln -s libocci.so.11.1 libocci.so

依赖安装

yum list|grep libaio
#如果有则不用安装,无则需要
sudo yum install libaio

如果 Instant Client 是这个系统上唯一安装的 Oracle 软件,那么更新运行时链接路径,例如:

sudo sh -c "echo /mnt/package/instantclient_11_2 > \
      /etc/ld.so.conf.d/oracle-instantclient.conf"

# ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.
sudo ldconfig

或者,在运行应用程序之前设置 LD_LIBRARY_PATH 环境变量,例如:

export LD_LIBRARY_PATH=/mnt/package/instantclient_11_2:$LD_LIBRARY_PATH

该变量语句可以添加到配置文件(如 ~/.bash_profile)和应用程序配置文件(如/etc/sysconfig/httpd)中。

如果你打算用客户端进行可选的oracle配置,比如tnsnames.ora, sqlnet.ora, ldap.ora,或者oraaccess.xml,需要提前新增相关的路径,比如

mkdir -p /mnt/package/instantclient_11_2/network/admin

这是与Instant Client链接的应用程序的默认Oracle配置目录。

另外,也可以将Oracle配置文件放入另一个可访问目录中。然后将环境变量TNS_ADMIN设置为该目录名称。

要从 SQL * Plus 包中使用诸如 sqlplus 之类的二进制文件,请将包解压缩到 Basic 包所在的目录,然后更新PATH的环境变量

export PATH=/mnt/package/instantclient_11_2:$PATH

开启你的应用

安装sqlplus

下载地址和上方的客户端在一起,一般是在下方。

解压到和客户端一个文件夹内

unzip -d instantclient_11_2 instantclient-sqlplus-linux.x64-11.2.0.4.0.zip

将sqlplus 软链到/usr/bin 目录下,方便启动

ln -s /mnt/package/instantclient_11_2/sqlplus /usr/bin

测试

sqlplus /nolog
SQL*Plus: Release 11.2.0.4.0 Production on Sat May 7 09:47:18 2022

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

SQL>

配置网络环境

export ORACLE_HOME=/mnt/package/instantclient_11_2
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORACLE_SID=orcl

创建监听配置文件

cd $TNS_ADMIN
touch tnsnames.ora
vim tnsnames.ora

文件中写入以下内容

orcl =
# orcl 是客户端调用的实例名称,理论上没有什么规范
(DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 123.222.34.56)(PORT = 11551))
    # 这里需要填写远程的host和port
    (CONNECT_DATA =
    # 这一部分则严格按照 目标端的tns文件填写
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORA19C.dbaora.com)
    )
  )

测试你的连接

sqlplus /nolog
SQL> conn zhangtong/1234567@orcl
Connected.
SQL> select * from dual;  

D
-
X


cx_oracle安装

下载地址

目前最新的版本是8,当然如果你的Oracle库或者python版本比较老旧,需要旧版的oracle,下载地址点这里

python的Oracle开发环境介绍

python 在线安装,指定版本的命令如下

python -m pip install cx-oracle==5.3

下表总结了可用的不同 Python 版本以及相应的存储库和 RPM 名称

Oracle Linux 8
Python VersionAppStream Module
3.9python39
3.8python38
3.6python36
2.7python27
Oracle Linux 7Repository: RPM name
Python VersionBase Oracle LinuxSoftware Collection Library
3.8 ol7_software_collections: rh-python38
3.6ol7_latest: python3ol7_software_collections: rh-python36
3.5 ol7_software_collections: rh-python35
3.4 ol7_software_collections: rh-python34
2.7ol7_latest: python

cx-oracle whil安装包下载地址

离线安装cx-oracle

pip install cx_Oracle-8.3.0-cp37-cp37m-win_amd64.whl

ipython中测试联通性

from sqlalchemy.engine import create_engine
import cx_Oracle

DIALECT = 'oracle'
SQL_DRIVER = 'cx_oracle'
USERNAME = 'zhangtong' #enter your username
PASSWORD = '12345678' #enter your password
HOST = '124.223.33.57' #enter the oracle db host url
PORT = 11521 # enter the oracle port number
SERVICE = 'ORA19C.dbaora.com' # enter the oracle db service name
ENGINE_PATH_WIN_AUTH = DIALECT + '+' + SQL_DRIVER + '://' + USERNAME + ':' + PASSWORD +'@' + HOST + ':' + str(PORT) + '/?service_name=' + SERVICE

engine = create_engine(ENGINE_PATH_WIN_AUTH)


#test query
import pandas as pd
test_df = pd.read_sql_query('SELECT * FROM tab', engine)