文章目录
- cx_Oracle 介绍
- cx_Oracle运行原理
- cx_Oracle 安装
- linux环境安装
- windows环境安装
- cx_Oracle 使用
- 单独使用
- 结合Pandas使用
- 参考资料
cx_Oracle 介绍
cx_Oracle 8是一个Python扩展模块,它提供了对Oracle数据库的访问能力。以下是cx_Oracle 8的一些关键特性和功能:
- 易于安装:可以通过PyPI轻松安装。
- Python版本支持:支持Python 3.6及更高版本。旧版本的cx_Oracle可能与旧版本的Python兼容。
- Oracle客户端支持:支持Oracle客户端版本11.2、12、18、19和21。利用Oracle的标准跨版本互操作性,可以连接到不同版本的Oracle数据库。
- 数据库版本兼容性:可以连接到Oracle数据库9.2、10、11、12、18、19或21(取决于使用的Oracle客户端版本)。
- SQL和PL/SQL执行:支持执行SQL语句和调用PL/SQL过程。
- 性能优化:底层的Oracle客户端库进行了优化,包括压缩获取、预获取、客户端和服务器结果集缓存以及具有自动调整功能的语句缓存。
- 网络服务:充分利用Oracle网络服务基础架构,包括加密的网络流量和安全功能。
- 数据类型支持:广泛支持Oracle数据类型,包括大型对象(CLOB和BLOB)。
- JSON数据类型支持:支持Oracle的JSON数据类型。
- SODA:支持简单的Oracle文档访问(SODA)。
- 数组操作:支持数组操作,用于高效插入和更新。
- 批错误处理:支持数组行计数和批错误处理。
- 大型结果集获取:支持获取大型结果集。
- 滚动光标支持:支持滚动光标,允许多次查看查询结果。
- PL/SQL隐式结果获取:轻松从PL/SQL返回查询结果。
- 行预取:有效利用网络,提高性能。
- 客户端结果缓存:提高频繁执行的查找语句的性能。
- 高级排队:支持使用数据库通知构建微服务应用程序。
- 连续查询通知:在数据更改时收到通知。
- 基于版本的重新定义:轻松切换应用程序以使用更新的PL/SQL逻辑。
- 应用程序上下文设置:支持在创建连接期间设置应用程序上下文,使数据库更容易访问应用程序元数据。
- 监控和跟踪:支持端到端监控和跟踪。
- 交易管理:包括会话池、标记和会话状态修复回调。
- 数据库驻留连接池(DRCP):支持Oracle数据库的高可用性功能。
- 外部身份验证:支持特权关系和外部身份验证。
- 分片数据库:支持Oracle数据库的分片功能。
cx_Oracle 8提供了丰富的功能,使得Python开发者可以高效地与Oracle数据库进行交互。
cx_Oracle运行原理
cx_Oracle的工作流程大致如下:
- 用户编写Python脚本,使用cx_Oracle模块中的API连接到Oracle数据库。
- cx_Oracle模块加载Oracle客户端库,这些库提供了与Oracle Net服务通信所需的功能。
- 通过Oracle Net服务,cx_Oracle模块在用户指定的数据库上建立连接。
- 用户通过cx_Oracle模块执行SQL和PL/SQL命令,这些命令通过Oracle Net发送到数据库。
- 数据库处理这些命令,并将结果通过Oracle Net返回给cx_Oracle模块。
- cx_Oracle模块将结果传递给Python脚本,供进一步处理或分析。
如下图所示:
通过这种架构,cx_Oracle模块为Python程序提供了强大且灵活的数据库访问能力,支持复杂的数据分析和操作任务。cx_Oracle架构主要涉及以下几个关键组件:
-
Python环境:cx_Oracle作为一个Python模块,需要在Python环境中运行。Python提供了cx_Oracle模块执行所需的运行时环境。
-
cx_Oracle模块:这是Python与Oracle数据库交互的接口。它提供了一组API,允许Python程序执行SQL语句,调用PL/SQL过程,以及处理来自Oracle数据库的数据。
-
Oracle客户端库:cx_Oracle需要Oracle客户端库来实现与Oracle数据库的通信。这些客户端库包括:
- Oracle Instant Client:免费的轻量级版本,包含最小化的二进制文件,用于支持Oracle客户端功能。
- 完整Oracle客户端:提供完整的客户端功能,包括各种工具和实用程序。
-
Oracle Net:Oracle Net服务是Oracle数据库的网络接口,负责在Oracle客户端和服务器之间传输数据。它不是cx_Oracle模块的一部分,但是cx_Oracle使用Oracle Net服务来建立和维护与数据库的连接。
-
Oracle数据库:这是cx_Oracle模块交互的目标数据库。它可以是一个本地数据库,也可以是一个远程数据库,通过网络访问。
-
操作系统和硬件平台:cx_Oracle可以在多种操作系统和硬件平台上运行,包括Linux、Windows和macOS。Oracle客户端库也需要与这些平台兼容。
-
用户身份验证:cx_Oracle通过用户名和密码进行身份验证,以建立与Oracle数据库的连接。
-
SQL和PL/SQL引擎:一旦连接建立,cx_Oracle可以利用Oracle数据库的SQL和PL/SQL引擎执行查询和过程。
cx_Oracle 安装
linux环境安装
在Linux环境下安装cx_Oracle的步骤可以总结如下:
-
使用pip安装cx_Oracle:
使用Python的包管理工具pip从PyPI安装cx_Oracle:python -m pip install cx_Oracle --upgrade
-
安装Oracle客户端:
使用cx_Oracle需要安装Oracle客户端库,这些库提供了必要的网络连接,允许cx_Oracle访问Oracle数据库实例。这里使用使用Oracle Instant Client ZIP文件:- 下载与你的Python 64位或32位架构相匹配的Oracle 21、19、18、12或11.2的“Basic”或“Basic Light”ZIP文件。Oracle Instant Client 下载。
- 解压ZIP包到应用程序可访问的单一目录中,例如:
mkdir -p /opt/oracle cd /opt/oracle unzip instantclient-basic-linux.x64-11.2.0.4.0.zip
- 安装
libaio
包,例如使用:sudo yum install libaio
-
配置环境变量:
设置环境变量
LD_LIBRARY_PATH
以指向Instant Client的适当目录, 在~/.bashrc
添加下面内容export LD_LIBRARY_PATH=/opt/oracle/instantclient_11_2:$LD_LIBRARY_PATH
使用
source ~/.bashrc
使环境变量生效。
windows环境安装
在Windows环境下安装cx_Oracle的步骤可以总结如下:
-
使用pip安装cx_Oracle:
使用Python的包管理工具pip从PyPI安装cx_Oracle:python -m pip install cx_Oracle --upgrade
-
安装Oracle客户端:
使用cx_Oracle需要安装Oracle客户端库,这些库提供了必要的网络连接,允许cx_Oracle访问Oracle数据库实例。这里使用使用Oracle Instant Client ZIP文件:- 下载与你的Python 64位或32位架构相匹配的Oracle 21、19、18、12或11.2的“Basic”或“Basic Light”ZIP文件。Oracle Instant Client 下载。
- 解压
instantclient-basic-windows.x64-11.2.0.4.0.zip
文件到D:\oracle\instantclient_11_2.
-
配置环境变量:
-
方法1: 使用代码中制定Oracle客户端路径。
import cx_Oracle # 填入下载下来的Oracle客户端解压后的路径 cx_Oracle.init_oracle_client(lib_dir=r"D:\oracle\instantclient_11_2")
-
方法2: 配置环境变量。
-
添加环境变量
ORACLE_HOME= D:\oracle\instantclient_11_2
-
把oracle客户端中
D:\oracle\instantclient_11_2
下的三个dell文件,复制到python编译器script目录下。
-
-
cx_Oracle 使用
单独使用
以下是cx_Oracle的一些基本使用示例:
-
连接到Oracle数据库
import cx_Oracle # 定义Oracle数据库的连接字符串 dsn = cx_Oracle.makedsn('hostname', port, service_name='service_name') # 创建连接,使用用户名和密码 connection = cx_Oracle.connect('username', 'password', dsn) # 确认连接 print("数据库连接成功")
-
执行查询并获取结果
# 创建游标对象 cursor = connection.cursor() # 执行SQL查询 cursor.execute("SELECT * FROM your_table") # 获取所有结果 results = cursor.fetchall() # 遍历结果 for row in results: print(row) # 关闭游标 cursor.close()
-
插入数据
# 再次创建游标 cursor = connection.cursor() # 执行插入操作 cursor.execute("INSERT INTO your_table (column1, column2) VALUES (:value1, :value2)", value1='data1', value2='data2') # 提交事务 connection.commit() # 关闭游标 cursor.close()
-
处理异常
try: # 尝试执行可能引发异常的操作 cursor.execute("SOME SQL STATEMENT") except cx_Oracle.DatabaseError as e: # 打印错误 print(f"Database error occurred: {e}") finally: # 确保游标被关闭 cursor.close()
-
关闭数据库连接
# 关闭数据库连接 connection.close()
这些示例提供了cx_Oracle的基本用法,包括连接到数据库、执行查询、插入数据、异常处理以及关闭连接。在实际应用中,你可能还需要处理更复杂的数据库操作和事务管理。
结合Pandas使用
Pandas 是 Python 中用于数据分析的一个强大库,它提供了快速、灵活且表达力强的数据结构,旨在使数据清洗和分析工作变得更加简单易行。结合 cx_Oracle
模块,你可以很容易地将 Pandas 用于操作 Oracle 数据库中的数据。以下是一些使用 Pandas 与 Oracle 数据库的基本示例:
-
读取Oracle数据到Pandas DataFrame
import cx_Oracle import pandas as pd # 连接到Oracle数据库 connection = cx_Oracle.connect('username', 'password', 'hostname:port/service_name') # 查询语句 query = "SELECT * FROM your_table" # 使用Pandas的read_sql_query函数读取数据 df = pd.read_sql_query(query, connection) # 查看DataFrame的前几行数据 print(df.head()) # 关闭连接 connection.close()
-
将Pandas DataFrame写入Oracle数据库
# 假设df是一个已经存在的DataFrame,我们要将它写入Oracle数据库 # 连接到Oracle数据库 connection = cx_Oracle.connect('username', 'password', 'hostname:port/service_name') # 将DataFrame写入数据库 df.to_sql('new_table', connection, if_exists='replace', index=False) # 关闭连接 connection.close()
to_sql
函数的if_exists
参数可以是'fail'
、'replace'
或'append'
,分别用于处理表已存在时失败、替换现有表或追加数据到现有表。 -
使用Pandas处理数据后更新Oracle数据库
# 假设我们要更新一些数据 # 连接到Oracle数据库 connection = cx_Oracle.connect('username', 'password', 'hostname:port/service_name') # 创建游标 cursor = connection.cursor() # 先读取数据 query = "SELECT * FROM your_table WHERE condition" df_to_update = pd.read_sql_query(query, connection) # 在Pandas DataFrame中处理数据 # 例如,将某个列的值增加1 df_to_update['column_name'] += 1 # 根据condition删除数据库的数据 # 定义删除条件 delete_sql = "DELETE FROM your_table WHERE column_name = :value" value = 'some_value' # 替换为实际的删除条件值 # 执行DELETE语句 cursor.execute(delete_sql, value=value) # 提交事务 connection.commit() # 将更新后的数据写回数据库 df_to_update.to_sql('your_table', connection, if_exists='append', index=False) # 关闭游标和连接 cursor.close() # 关闭连接 connection.close()
请注意,这些示例假设你已经安装了
cx_Oracle
和pandas
模块,并且已经正确配置了Oracle数据库的访问权限和网络设置。在实际应用中,你可能需要根据实际的数据库表结构和业务逻辑调整SQL查询语句和数据处理逻辑。
参考资料
Quick Start cx_Oracle Installation
Oracle Instant Client Downloads for Linux x86-64 (64-bit)
python(28): 连接oracle环境离线安装及报错解决87,193
python操作Oracle数据库
15分钟解决此问题,DPI-1047: Cannot locate a 64-bit Oracle Client library: “The specified module could not be