尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Python 连 Oracle 数据库:cx_Oracle 配置与连接实例

发布时间:2026/9/29 21:31:05

资讯中心
01
ARTICLE

Python 连 Oracle 数据库:cx_Oracle 配置与连接实例

Python 连 Oracle 数据库:cx_Oracle 配置与连接实例
1. 为什么 Python 连 Oracle 总在第一步卡住Python 连 Oracle 数据库这件事说难不难说简单也踩坑。核心工具就是 cx_Oracle 这个扩展模块它负责把 Python 和 Oracle 客户端之间的通道打通让你能用几行代码完成查询、插入、更新。适合谁本地开发调试、测试环境跑数据脚本、做数据迁移小工具的后端同学尤其是手上只有一台装了 Oracle 的机器、想快速验证连通性的场景。真正让人头疼的不是 SQL 写法而是环境。cx_Oracle 本身只是个翻译官它不包含 Oracle 的底层通信库必须依赖本机的 Oracle Instant Client。很多人pip install cx_Oracle之后一运行就报DPI-1047: Cannot locate a 64-bit Oracle Client library问题就出在这里。另一个高频坑是位数不匹配Python 是 64 位装的 Instant Client 却是 32 位照样连不上。这篇就按装库 → 配客户端 → 写连接串 → 跑通查询 → 排错的顺序走一遍每一步都给可复制的命令和代码。连接字符串、环境变量、最小查询脚本都会给全你照着敲就能在本地跑出结果。顺带说一句如果你后面要把这类脚本接到大模型做自动化TaoToken 的 API 网关https://taotoken.net/api可以统一管理调用凭证这个后面 CTA 部分再展开。2. 前置准备cx_Oracle 与 Oracle Instant Client 怎么配2.1 安装 cx_Oracle先确认 Python 版本cx_Oracle 8 以上支持 Python 3.6现在主流用 8.3 或更高。命令行执行python -m pip install cx_Oracle --upgrade装完验证一下python -c import cx_Oracle; print(cx_Oracle.version)能打印出版本号就说明 Python 侧 OK。注意别用pip install cx_oracle这种大小写混写虽然多数情况能识别但规范写法是cx_Oracle。2.2 下载并解压 Oracle Instant Client去 Oracle 官网下载 Instant Client Basic 包选对应操作系统的版本。关键点位数必须和你的 Python 一致。用下面命令确认 Python 位数python -c import platform; print(platform.architecture())输出64bit就下 64 位的 Instant Client。下载后解压到一个固定目录比如 Windows 下C:\oracle\instantclient_21_12Linux/macOS 下/opt/oracle/instantclient_21_12。这个路径后面要写进环境变量别放在临时目录里。2.3 配置环境变量Windows 下把 Instant Client 目录加到PATH或者新建ORACLE_HOME指向它。Linux/macOS 在~/.bashrc或~/.zshrc里加export LD_LIBRARY_PATH/opt/oracle/instantclient_21_12:$LD_LIBRARY_PATHmacOS 用DYLD_LIBRARY_PATH。改完记得source一下或者重开终端。这一步不做cx_Oracle 找不到库文件直接报 DPI-1047。2.4 关于 TaoToken 的定位TaoToken 是一个大模型 API 聚合网关官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。它不替代 Oracle 客户端也不碰你的数据库连接而是当你把查库结果喂给模型做分析这类流程串起来时用它统一管理模型调用的 Key 和额度。数据库连接本身还是走 cx_Oracle 这套。两者是上下游关系别混为一谈。3. 可复制的连接配置与最小查询脚本3.1 连接字符串的三种写法cx_Oracle 的connect()支持多种传参方式最常用的是用户名/密码主机:端口/服务名这种 EZConnect 语法import cx_Oracle # 写法一EZConnect 字符串 dsn cx_Oracle.makedsn(192.168.1.100, 1521, service_nameORCLPDB1) connection cx_Oracle.connect(userscott, passwordtiger, dsndsn)# 写法二直接拼字符串 connection cx_Oracle.connect(scott/tiger192.168.1.100:1521/ORCLPDB1)# 写法三分离参数推荐用于配置化 connection cx_Oracle.connect( userscott, passwordtiger, host192.168.1.100, port1521, service_nameORCLPDB1 )三种等价写法三最清晰方便从环境变量或配置文件读取。注意service_name和sid的区别新版本 Oracle 多用 service_name老库可能用 SID写错了会报ORA-12505。3.2 用环境变量管理敏感信息别把密码硬编码进脚本。用环境变量export ORACLE_USERscott export ORACLE_PWDtiger export ORACLE_DSN192.168.1.100:1521/ORCLPDB1Python 里读取import os import cx_Oracle user os.environ.get(ORACLE_USER) pwd os.environ.get(ORACLE_PWD) dsn os.environ.get(ORACLE_DSN) connection cx_Oracle.connect(useruser, passwordpwd, dsndsn)3.3 完整的最小查询脚本把下面这段存成test_oracle.py改掉连接参数就能跑import cx_Oracle def main(): dsn cx_Oracle.makedsn(192.168.1.100, 1521, service_nameORCLPDB1) with cx_Oracle.connect(userscott, passwordtiger, dsndsn) as conn: with conn.cursor() as cursor: cursor.execute(SELECT sysdate FROM dual) row cursor.fetchone() print(数据库当前时间:, row[0]) cursor.execute(SELECT table_name FROM user_tables WHERE rownum 5) for r in cursor.fetchall(): print(表名:, r[0]) if __name__ __main__: main()这里用了with上下文管理器退出时自动关闭游标和连接比手动close()更省心。SELECT sysdate FROM dual是最轻量的连通性验证不依赖任何业务表。3.4 参数化查询避免注入实际查询带条件时用绑定变量别用字符串拼接cursor.execute(SELECT * FROM employees WHERE department_id :dept, dept50) rows cursor.fetchall():dept是占位符cx_Oracle 会做类型转换和转义既安全又能复用执行计划。4. 验证请求跑一次连接与查询4.1 执行脚本看结果命令行运行python test_oracle.py正常输出类似数据库当前时间: 2024-06-12 15:32:08 表名: EMPLOYEES 表名: DEPARTMENTS 表名: JOBS看到时间戳和表名说明从 Python 到 Oracle 的整条链路通了cx_Oracle 加载了 Instant Client连接串解析正确认证通过SQL 执行并返回了结果。4.2 用连接池应对多次请求如果脚本要反复查库每次新建连接开销大。用 SessionPoolpool cx_Oracle.SessionPool( userscott, passwordtiger, dsn192.168.1.100:1521/ORCLPDB1, min2, max5, increment1, encodingUTF-8 ) with pool.acquire() as conn: with conn.cursor() as cursor: cursor.execute(SELECT COUNT(*) FROM employees) print(员工总数:, cursor.fetchone()[0])min/max控制池大小increment是每次扩容步长。测试环境 min 设 1、max 设 5 足够。4.3 验证字符集与中文Oracle 里存中文连接时字符集不对会乱码。检查数据库字符集cursor.execute(SELECT value FROM nls_database_parameters WHERE parameterNLS_CHARACTERSET) print(cursor.fetchone()[0])常见是AL32UTF8。如果返回中文乱码在connect()里加encodingUTF-8和nencodingUTF-8显式指定。5. 本篇常见错排查5.1 DPI-1047 找不到客户端库报错原文DPI-1047: Cannot locate a 64-bit Oracle Client library。原因就两个没装 Instant Client或者装了但环境变量没生效。排查顺序先确认 Instant Client 目录存在且里面有oci.dllWindows或libclntsh.soLinux再确认PATH/LD_LIBRARY_PATH指向该目录最后确认位数和 Python 一致。改完环境变量一定要重开终端旧终端读不到新变量。5.2 ORA-12505 监听器不认识服务名ORA-12505: TNS:listener does not currently know of SID given in connect descriptor。这是连接串里 service_name 或 SID 写错了。用lsnrctl status看监听器注册了哪些服务或者问 DBA 要准确的 service_name。PDB 环境下 service_name 通常是ORCLPDB1这种不是ORCL。5.3 ORA-01017 用户名密码错误ORA-01017: invalid username/password; logon denied。先确认用户名大小写Oracle 默认用户名大写但连接时一般不用管。再确认密码没被环境变量里的特殊字符截断比如密码含$在 shell 里会被展开用单引号包起来。还有可能是账户被锁ALTER USER scott ACCOUNT UNLOCK;解锁。5.4 中文乱码查询结果中文变问号或方块是字符集不匹配。除了上面说的encoding参数还要确认 Instant Client 的NLS_LANG环境变量。Linux 下设export NLS_LANGAMERICAN_AMERICA.AL32UTF8Windows 下在系统环境变量里加同名的。设完重开终端再跑。5.5 连接超时ORA-12170: TNS:Connect timeout occurred。先ping主机通不通再telnet 主机 1521看端口开没开。防火墙、安全组、Oracle 监听器没启动都可能导致。本地测试环境常见的是监听器没起lsnrctl start一下。6. 把数据库脚本接进模型工作流数据库连通只是第一步。实际项目里你可能会把查询结果交给大模型做摘要、分类或生成报告。这时候调用模型 API 的凭证管理就成了新问题多个脚本、多个环境Key 散落各处容易乱。TaoToken 的 API 网关https://taotoken.net/api提供统一的调用入口把模型调用的 Key 集中管理脚本里只引用一个网关地址即可。如果你只是偶尔验证模型输出可以直接用模型对话页面快速试https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。要是长期跑编码类任务或 Agent 流程Coding Plan 更合适https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。需要自己管理 Key 和额度时进控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API Keys 页面在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。接入细节看文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。用 Claude Code 的话Anthropic 兼容接入说明在 https://taotoken.net/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。回到数据库本身最后给个实用建议把连接参数、Instant Client 路径、NLS_LANG 这三样写进一个env.sh或.env文件脚本启动时加载换机器时只改这一个文件。我试过在三个测试环境之间切换靠这个办法省了大量重复配置时间。跑通SELECT sysdate FROM dual之后再往上叠业务查询就顺了。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。