Scott's Blog

学则不固, 知则不惑

0%

cx_Oracle 在 Linux 上的安装与配置

cx_Oracle 是一个Python扩展模块,用来支持访问Oracle数据库,在 python 下,即便你使用其它的数据库 ORM 映射框架, 也需要配置 cx_Oracle, 这篇文章介绍了如何配置 cx_Oracle 以便让你可以访问 Oracle 数据库。

cx_Oracle

下面这种图介绍了 cx_Oracle 在与 Oracle 数据库交互中起的作用。

安装 cx_Oracle 本身很简单:

1
python -m pip install cx_Oracle --upgrade

但是我们还需要安装 Oracle 客户端的库, 可以选择 Oracle Instant Client 或者 Oracle Database Express Edition (“XE”), 后者需要你本地安装了 oracle 数据库, 我们选择 Instant Client, Instant Client 提供了两种版本,ziprpm 版本,zip 版本解压到本地电脑即可开始配置,rpm 则是提供给 Linux 使用的,要详细了解 rpm ,这里可以推荐一篇 IBM 的文章

安装 Instant Client 的步骤:

  1. 前往 Oracle Instant Client 下载页面 下载正确的版本,一定要参考服务端的 Oracle 版本,因为客户端的高版本并不支持连接低版本的服务端,例如我第一次使用客户端 21 版本连接服务端 11 的版本就报错: ORA-28547

下图说明了 Oracle 客户端与服务端的兼容关系:

IMG_4465.PNG
  1. 在 Linux 上,使用 unzip 命令解压到你需要的文件夹
1
2
3
mkdir -p /opt/oracle
cd /opt/oracle
unzip instantclient-basic-linux.x64-你下载的版本.zip
  1. 安装 libaio, libaio是Linux下的一个异步非阻塞接口,它提供了以异步非阻塞方式来读写文件的方式,读写效率比较高。
1
2
sudo yum install libaio
# 有的 linux 叫做libaio1
  1. 如果你不担心影响其它的程序,可以永久的将 Instant Client 添加到动态库链接:
1
2
echo /opt/oracle/instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf
ldconfig
  1. 如果你使用 tnsnames.ora, sqlnet.oraoraaccess.xml 则需要更改 cx_Oracle 初始化配置
1
2
import cx_Oracle
cx_Oracle.init_oracle_client(config_dir="/home/your_username/oracle/your_config_dir")

或者设置环境变量 TNS_ADMIN, 并将相关文件放至 network/admin 子文件夹。

通过 RPMs 安装的方式类似,在此不再赘述。

Docker file

下面是一个 Flask 应用配置 Oracle 的部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM python:3.7.3
# Set up Oracle
WORKDIR /opt/oracle
RUN apt-get update && apt-get install -y libaio1 wget unzip \
&& cp /app/query_eda_tool/oracle_configs/instantclient-basic-linux.x64-12.2.0.1.0.zip . \
&& unzip instantclient-basic-linux.x64-12.2.0.1.0.zip \
&& rm -f instantclient-basic-linux.x64-12.2.0.1.0.zip \
&& cd /opt/oracle/instantclient* \
&& rm -f *jdbc* *occi* *mysql* *README *jar uidrvci genezi adrci \
&& echo /opt/oracle/instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf \
&& ldconfig \
&& mkdir -p /opt/oracle/instantclient_12_2/network/admin \
&& cp /app/query_eda_tool/oracle_configs/tnsnames.ora /opt/oracle/instantclient_12_2/network/admin/ \
&& cp /app/query_eda_tool/oracle_configs/sqlnet.ora /opt/oracle/instantclient_12_2/network/admin/

注:我的项目文件中已经从官网下载好 instantclient-basic-linux.x64-12.2.0.1.0.zip 文件。

参考