Python数据分析之-Oracle数据库连接

文章目录

    • cx_Oracle 介绍
    • cx_Oracle运行原理
    • cx_Oracle 安装
      • linux环境安装
      • windows环境安装
    • cx_Oracle 使用
      • 单独使用
      • 结合Pandas使用
    • 参考资料

og.csdnimg.cn/direct/9e2cbae962a643cdaa5846edba8ce49f.png)

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架构主要涉及以下几个关键组件:

  1. Python环境:cx_Oracle作为一个Python模块,需要在Python环境中运行。Python提供了cx_Oracle模块执行所需的运行时环境。

  2. cx_Oracle模块:这是Python与Oracle数据库交互的接口。它提供了一组API,允许Python程序执行SQL语句,调用PL/SQL过程,以及处理来自Oracle数据库的数据。

  3. Oracle客户端库:cx_Oracle需要Oracle客户端库来实现与Oracle数据库的通信。这些客户端库包括:

    • Oracle Instant Client:免费的轻量级版本,包含最小化的二进制文件,用于支持Oracle客户端功能。
    • 完整Oracle客户端:提供完整的客户端功能,包括各种工具和实用程序。
  4. Oracle Net:Oracle Net服务是Oracle数据库的网络接口,负责在Oracle客户端和服务器之间传输数据。它不是cx_Oracle模块的一部分,但是cx_Oracle使用Oracle Net服务来建立和维护与数据库的连接。

  5. Oracle数据库:这是cx_Oracle模块交互的目标数据库。它可以是一个本地数据库,也可以是一个远程数据库,通过网络访问。

  6. 操作系统和硬件平台:cx_Oracle可以在多种操作系统和硬件平台上运行,包括Linux、Windows和macOS。Oracle客户端库也需要与这些平台兼容。

  7. 用户身份验证:cx_Oracle通过用户名和密码进行身份验证,以建立与Oracle数据库的连接。

  8. SQL和PL/SQL引擎:一旦连接建立,cx_Oracle可以利用Oracle数据库的SQL和PL/SQL引擎执行查询和过程。

cx_Oracle 安装

linux环境安装

在Linux环境下安装cx_Oracle的步骤可以总结如下:

  1. 使用pip安装cx_Oracle
    使用Python的包管理工具pip从PyPI安装cx_Oracle:

    python -m pip install cx_Oracle --upgrade
    
  2. 安装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
      
  3. 配置环境变量

    设置环境变量LD_LIBRARY_PATH以指向Instant Client的适当目录, 在 ~/.bashrc 添加下面内容

    export LD_LIBRARY_PATH=/opt/oracle/instantclient_11_2:$LD_LIBRARY_PATH
    

    使用source ~/.bashrc使环境变量生效。

windows环境安装

在Windows环境下安装cx_Oracle的步骤可以总结如下:

  1. 使用pip安装cx_Oracle
    使用Python的包管理工具pip从PyPI安装cx_Oracle:

    python -m pip install cx_Oracle --upgrade
    
  2. 安装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.
  3. 配置环境变量

    • 方法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的一些基本使用示例:

  1. 连接到Oracle数据库

    import cx_Oracle# 定义Oracle数据库的连接字符串
    dsn = cx_Oracle.makedsn('hostname', port, service_name='service_name')
    # 创建连接,使用用户名和密码
    connection = cx_Oracle.connect('username', 'password', dsn)# 确认连接
    print("数据库连接成功")
    
  2. 执行查询并获取结果

    # 创建游标对象
    cursor = connection.cursor()# 执行SQL查询
    cursor.execute("SELECT * FROM your_table")# 获取所有结果
    results = cursor.fetchall()# 遍历结果
    for row in results:print(row)
    # 关闭游标
    cursor.close()
    
  3. 插入数据

    # 再次创建游标
    cursor = connection.cursor()# 执行插入操作
    cursor.execute("INSERT INTO your_table (column1, column2) VALUES (:value1, :value2)", value1='data1', value2='data2')# 提交事务
    connection.commit()# 关闭游标
    cursor.close()
    
  4. 处理异常

    try:# 尝试执行可能引发异常的操作cursor.execute("SOME SQL STATEMENT")
    except cx_Oracle.DatabaseError as e:# 打印错误print(f"Database error occurred: {e}")
    finally:# 确保游标被关闭cursor.close()
    
  5. 关闭数据库连接

    # 关闭数据库连接
    connection.close()
    

这些示例提供了cx_Oracle的基本用法,包括连接到数据库、执行查询、插入数据、异常处理以及关闭连接。在实际应用中,你可能还需要处理更复杂的数据库操作和事务管理。

结合Pandas使用

Pandas 是 Python 中用于数据分析的一个强大库,它提供了快速、灵活且表达力强的数据结构,旨在使数据清洗和分析工作变得更加简单易行。结合 cx_Oracle 模块,你可以很容易地将 Pandas 用于操作 Oracle 数据库中的数据。以下是一些使用 Pandas 与 Oracle 数据库的基本示例:

  1. 读取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()
    
  2. 将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',分别用于处理表已存在时失败、替换现有表或追加数据到现有表。

  3. 使用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_Oraclepandas 模块,并且已经正确配置了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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/35907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【华为OD机试|01】最远足迹(Java/C/Py/JS)

目录 一、题目介绍 1.1 题目描述 1.2 备注: 1.3 输入描述 1.4 输出描述 1.5 用例 二、Java代码实现 2.1 实现思路 2.2 详细代码 2.3 代码讲解: 三、C语言实现 3.1实现步骤 3.2 实现代码 3.3 代码详解 四、Python实现 4.1 实现步骤 4.2 …

项目实战系列三: 家居购项目 第六部分

文章目录 🌈Ajax检验注册名🌈Ajax添加购物车🌈上传与更新家居图片🌈作业布置🍍会员登陆后不能访问后台管理🍍解决图片冗余问题🍍分页导航完善 🌈Ajax检验注册名 需求分析 注册会员时…

推动多模态智能模型发展:大型视觉语言模型综合多模态评测基准

随着人工智能技术的飞速发展,大型视觉语言模型(LVLMs)在多模态应用领域取得了显著进展。然而,现有的多模态评估基准测试在跟踪LVLMs发展方面存在不足。为了填补这一空白,本文介绍了MMT-Bench,这是一个全面的…

js获取字符串中超链接,并加样式跳转页面

效果图 主要代码:js this.$nextTick(() > {// 给循环出来的div标签加个id为let container document.getElementById("linkTo");container.innerHTML container.textContent.replace(/(https?:\/\/[^\s])/g, function (match) {var link documen…

【微前端-Single-SPA、qiankun的基本原理和使用】

背景 在实际项目中,随着日常跌倒导致的必然墒增,项目会越来越冗余不好维护,而且有时候一个项目会使用的其他团队的功能,这种跨团队不好维护和管理等等问题,所以基于解决这些问题,出现了微前端的解决方案。…

前端项目vue3/React使用pako库解压缩后端返回gzip数据

pako仓库地址:https://github.com/nodeca/pako 文档地址:pako 2.1.0 API documentation 外部接口返回一个直播消息或者图片数据是经过zip压缩的,前端需要把这个数据解压缩之后才可以使用,这样可以大大降低网络数据传输的内容&…

Depth Anything V1,V2论文解读

Depth Anything 引言Depth Anything V1标注方法学习标注图像发挥未标注图像的潜力语义辅助感知 Depth Anything V2总体框架流程 引言 在深度估计领域,单目深度估计(Monocular Depth Estimation,MDE)是指利用单个摄像头拍摄的图像…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十八)

课程地址: 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程,一套精通鸿蒙应用开发 (本篇笔记对应课程第 28 节) P28《27.网络连接-Http请求数据》 案例: 这里不懂后端假设服务器的前端小伙伴就需要课程源码资料了…

深度之眼(二十五)——研究生学习计划安排

文章目录 一、前言二、结构安排和规划2.1 夯实基础2.2 分方向训练(待)2.3 进阶训练 三、其他 一、前言 课题组这边是需要对机器视觉有所要求吧,也就是CV方向。这一届研三师兄也都是在大厂拿到30W的年薪了,也是需要拥抱深度学习这…

java收徒 java辅导 java试用期辅导 java零基础学习

💗博主介绍:✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末报名辅导🌟 感兴趣的可以先收藏起来,还有大家…

守护变电箱消防安全,全氟己酮自动灭火片该安装在哪个位置?

变电箱、配电柜、换电柜是电力设备的重要组成部分,安全性至关重要。但在使用过程中,容易受到电气、机械、环境等因素影响,出现接触不良、短路、漏电等安全隐患,从而引发火灾事故。为了及时防范火灾风险,提前安装一款能…

Vue中数组的【响应式】操作

在 Vue.js 中,当你修改数组时,Vue 不能检测到以下变动的数组: 当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] newValue当你修改数组的长度时,例如:vm.items.length newLength 为…

Java基础(二)——数组,方法,方法重载

个人简介 👀个人主页: 前端杂货铺 ⚡开源项目: rich-vue3 (基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL) 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 &#x1…

01_02_Mybatis的配置文件与基于XML的使用

1、引入日志 在这里我们引入SLF4J的日志门面&#xff0c;使用logback的具体日志实现&#xff1b;引入相关依赖&#xff1a; <!--日志的依赖--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version&g…

2024国内外音频转换器大盘点,盘点音乐剪辑的7个有效方法!

当遇到不支持的音乐文件时&#xff0c;您可能就会想要拥有一款优秀的音频转换器。当您想减小大量音乐文件以节省设备存储空间时&#xff0c;它也可以很好地帮上忙。如果您正在寻找这么一款音频转换器&#xff0c;那么&#xff0c;请不要错过这篇文章。一款顶尖的音频转换器不仅…

USB2.0学习1--基本概念

目录 1.USB概念 2.USB协议发展 3.USB接口类型 3.1 TYPE类型 3.2 Mini类型 3.3 Micro类型 4. USB体系结构和关键概念 4.1 USB工作原理 4.2 USB物理拓扑结构 4.3 USB逻辑拓扑结构 4.4 USB软件架构 4.5 USB数据流模型 4.5.1 USB设备端点 4.5.2 USB管道 4.6 USB即插…

网工内推 | 国企信息工程师,信息系统项目管理师优先,最高14薪

01 上海浦东软件园股份有限公司 &#x1f537;招聘岗位&#xff1a;信息化管理工程师 &#x1f537;岗位职责&#xff1a; 1. 根据公司战略、数字化总体架构规划和IT 技术趋势&#xff0c;制定信息化系统的规划与设计&#xff0c;并制定实施计划。 2. 统筹公司信息化系统管理…

Redis-实战篇-缓存击穿问题及解决方案

文章目录 1、缓存击穿2、常见的解决方案有两种&#xff1a;2.1、互斥锁2.2、逻辑过期2.3、两种方案对比 3、利用互斥锁解决缓存击穿问题3.1、ShopServiceImpl.java3.2、使用 jmeter.bat 测试高并发 4、利用逻辑过期解决缓存击穿问题 1、缓存击穿 缓存击穿问题 也叫 热点key问题…

<电力行业> - 《第4课:什么是电力?什么是发输变配用5环节?》

1 什么是电力&#xff1f; 我们对于平日生活中离不开的电很熟悉&#xff0c;但是电力是什么&#xff1f; 其实&#xff0c;电力就是电能作为动力的能源。电力就是我们说的电&#xff0c;不过更多了系统化。 19世纪70年代&#xff0c;电力的发明和应用掀起了第二次工业化高潮。…

关于WebSocket

WebSocket 与传统的 HTTP 协议对比 在实时通信领域&#xff0c;传统的 HTTP 协议存在以下一些问题&#xff1a; 频繁的请求和响应&#xff1a;每次通信都需要建立和关闭连接&#xff0c;带来额外的开销。高延迟&#xff1a;每次通信都需要经过多个网络层的传输&#xff0c;延…