文章详细记录了在Python环境中安装和使用requests库及oracledb连接Oracle数据库的过程。
首先展示了requests库的安装验证方法,包括版本检查和使用示例。
随后重点解析了Oracle数据库连接的4类常见错误:模块未安装、参数错误、服务名未注册和SQL语法错误,提供了详细的错误排查方法和正确代码模板。
文章特别强调使用lsnrctl services查看正确服务名、移除encoding参数、SQL语句不加分号等关键点,并给出了最终正确的代码示例。
通过系统总结连接Oracle数据库的典型错误及解决方案,为开发者提供了实用的技术参考。
关联阅读推荐
大数据开发数据库环境搭建:Oracle Database 21c XE 和 Oracle SQL Developer 安装,连接数据库,创建100 万行数据,分析练习
pip3 install requests
(global_venv) PS C:\Users\86178\PyCharmMiscProject\mumu\day> cd .. (global_venv) PS C:\Users\86178\PyCharmMiscProject\mumu> pip3 install requests Collecting requests Downloading requests-2.33.1-py3-none-any.whl.metadata (4.8 kB) Collecting charset_normalizer<4,>=2 (from requests) Downloading charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl.metadata (41 kB) Collecting idna<4,>=2.5 (from requests) Downloading idna-3.11-py3-none-any.whl.metadata (8.4 kB) Collecting urllib3<3,>=1.26 (from requests) Downloading urllib3-2.6.3-py3-none-any.whl.metadata (6.9 kB) Collecting certifi>=2023.5.7 (from requests) Downloading certifi-2026.2.25-py3-none-any.whl.metadata (2.5 kB) Downloading requests-2.33.1-py3-none-any.whl (64 kB) Downloading charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl (158 kB) Downloading idna-3.11-py3-none-any.whl (71 kB) Downloading urllib3-2.6.3-py3-none-any.whl (131 kB) Downloading certifi-2026.2.25-py3-none-any.whl (153 kB) Installing collected packages: urllib3, idna, charset_normalizer, certifi, requests Successfully installed certifi-2026.2.25 charset_normalizer-3.4.7 idna-3.11 requests-2.33.1 urllib3-2.6.3 (global_venv) PS C:\Users\86178\PyCharmMiscProject\mumu> ls 目录: C:\Users\86178\PyCharmMiscProject\mumu Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2026-04-21 下午 04:22 .idea d----- 2026-04-16 上午 09:12 AI d----- 2026-04-21 下午 04:20 day d----- 2026-04-16 上午 09:56 niuke d----- 2026-04-21 上午 09:41 review d----- 2026-04-17 上午 09:47 test安装完验证,怎么没看到request呢
你安装的requests库是 Python 包,不会在目录里显示为文件夹。它被安装到了你的虚拟环境global_venv的Lib/site-packages目录中。
验证 requests 是否安装成功的方法:
1.在 Python 中导入测试(最直接)
bash
python -c "import requests; print(requests.__version__)"
如果显示版本号(如2.33.1),说明安装成功。
2.查看已安装的包列表
bash
pip list应该能看到requests在列表中。
(global_venv) PS C:\Users\86178\PyCharmMiscProject\mumu> pip list Package Version ------------------ --------- certifi 2026.2.25 charset-normalizer 3.4.7 idna 3.11 markdown-it-py 4.0.0 mdurl 0.1.2 pip 26.0.1 Pygments 2.20.0 requests 2.33.1 rich 15.0.0 urllib3 2.6.3从
pip list的输出可以看到,requests 已经成功安装了!text
requests 2.33.1你现在可以正常使用
requests库了。快速验证一下:bash
python -c "import requests; print(requests.__version__)"应该会输出
2.33.1。你现在可以这样使用:
import requests # 发送 GET 请求 response = requests.get('https://www.baidu.com') print(response.status_code) # 200 表示成功 # 发送 POST 请求 # response = requests.post('https://httpbin.org/post', data={'key': 'value'}) # 处理 JSON 数据 # data = response.json()
3.查看 requests 的安装位置
bash
pip show requests
会显示安装路径,类似:
text
Location: C:\Users\86178\PyCharmMiscProject\mumu\global_venv\Lib\site-packages
4.进入 Python 交互环境测试
bash
python >>> import requests >>> response = requests.get('https://www.baidu.com') >>> print(response.status_code) 200为什么ls看不到?
ls显示的是当前目录下的文件和文件夹Python 包安装在虚拟环境的
site-packages目录,不在你的项目根目录这是正常的 Python 包管理机制
你可以直接运行上面的验证命令,应该能正常使用requests库了!
测试连接数据库,输出数据
Oracle 21c XE 和 Python 3.13.13 兼容吗
兼容。安装的Oracle 21c XE和Python 3.13.13可以配合使用,官方驱动
python-oracledb明确支持这一组合。只需在你的终端(如命令提示符或 PowerShell)执行以下命令即可完成安装:
bash
pip install oracledb --upgrade⚙️ 两种连接模式
安装后,你有两种方式连接数据库,推荐优先尝试Thin 模式:
Thin 模式 (推荐新手):这是驱动默认的模式,无需安装 Oracle 客户端,直接用 Python 代码就能连接,非常简单省事。前提是数据库版本需为 12.1 或更高(你的 21c 完全满足)。
Thick 模式 (高级功能):如果需要用到 Oracle 的一些高级功能(如 AQ 消息队列),则需额外下载Oracle Instant Client并配置环境变量,连接时需切换到此模式。
以下是运行成功的完整示例
#第三方模块 安装 打开Python控制台(终端) #项目根目录执行命令 #pip3 install requests #做爬虫的库 #安装完验证 #在Python代码中import import requests as rs import oracledb as orcl #没有名称为 'oracledb' 的模块? #oracledb 未下载:pip install oracledb # 使用 xepdb1 服务名(推荐,这是可插拔数据库) config_1 = { "user": "BIGDATA_DEV", # 改为大写 "password": "dev123", "dsn": "127.0.0.1:1521/xepdb1" } #从报错信息 ORA-01017: 用户名/口令无效; 登录被拒绝 来看,你的 Python 代码和 Oracle 数据库的连接是成功建立的,问题出在身份验证这一步。 #检查是否有大小写问题(Oracle 默认存储用户名是大写的,但通常不区分) #不是大小写的原因,密码错了已改正。 # config_1 = { # "user":"scott", # "password":"123456", # "dsn":"127.0.0.1:1521/orcl" # #"encoding":"UTF-8" # } # 这个错误 DPY-6001 意思是:你的 Python 程序成功找到了 Oracle 监听器(在 127.0.0.1 的 1521 端口),但这个监听器不知道有一个叫 "orcl" 的服务。 # 这通常是因为连接字符串中使用的“服务名”与数据库实际注册的名称不符。 # scott 用户可能不存在或未解锁 # scott 是 Oracle 示例用户,在 XE 版本中可能默认不存在 # 如果连接成功但提示用户不存在,需要先创建或解锁 scott #oracledb 的 connect() 方法不支持 encoding 参数。 conn = orcl.connect(**config_1) # cur = conn.cursor() # cur.execute("select * from emp") # res = cur.fetchall() # for i in res: ##[(7369,'Smith',...),(第二行数据),(第三行数据)..] # print(i) # conn.close() try: conn = orcl.connect(**config_1) print("数据库连接成功!") cur = conn.cursor() cur.execute("SELECT * FROM orders WHERE ROWNUM <= 10") res = cur.fetchall() for i in res: print(i) cur.close() conn.close() except orcl.Error as e: print(f"数据库错误: {e}") #现在遇到的 ORA-00933: SQL 命令未正确结束 错误,是因为你 SQL 语句末尾的分号 ; 导致的。 #在 Python 的 oracledb 执行单条 SQL 语句时,不需要也不能加 ;。分号是 SQL 客户端(如 SQL*Plus、DBeaver)中的语句分隔符,但在编程接口中直接传入会报错。输出
数据库连接成功! (619, 2537, 'Product_403', 3774.73, datetime.datetime(2025, 7, 20, 13, 24, 13), 'COMPLETED') (620, 2952, 'Product_283', 3322.63, datetime.datetime(2025, 4, 26, 13, 24, 13), 'COMPLETED') (621, 739, 'Product_1', 252.36, datetime.datetime(2025, 12, 29, 13, 24, 13), 'COMPLETED') (622, 5170, 'Product_469', 1832.32, datetime.datetime(2025, 8, 11, 13, 24, 13), 'COMPLETED') (623, 457, 'Product_407', 915.15, datetime.datetime(2025, 6, 23, 13, 24, 13), 'COMPLETED') (624, 4381, 'Product_150', 4850.8, datetime.datetime(2026, 1, 16, 13, 24, 13), 'PENDING') (625, 9542, 'Product_173', 4984.05, datetime.datetime(2025, 9, 6, 13, 24, 13), 'CANCELLED') (626, 4483, 'Product_219', 2489.47, datetime.datetime(2025, 10, 13, 13, 24, 13), 'PENDING') (627, 942, 'Product_20', 4500.96, datetime.datetime(2026, 1, 5, 13, 24, 13), 'PENDING') (628, 8995, 'Product_188', 2744.2, datetime.datetime(2026, 3, 4, 13, 24, 13), 'CANCELLED') 进程已结束,退出代码为 0提示:没有配置任何数据源来运行此 SQL 并提供高级代码辅助。 通过问题菜单(Ctrl+.)禁用此检查。
这个提示是 PyCharm 的代码辅助功能警告,不是真正的错误。它只是表示 PyCharm 不知道你的数据库结构,所以无法提供代码补全和语法检查。
解决方法:
方法1:忽略警告(最简单)
代码仍然可以正常运行,这只是编辑器的提示。点击提示框,选择"禁用此检查"即可。
方法2:配置数据源(推荐)
让 PyCharm 连接到你的 Oracle 数据库,获得代码补全功能:
右侧边栏→Database工具窗口
点击+→Data Source→Oracle
填写连接信息:
Host:
127.0.0.1Port:
1521Service/SID:
orclUser: bigdata_dev
Password: dev
123点击Test Connection测试
应用并确定
配置成功后,PyCharm 就能识别表名、字段名,并提供智能提示。
Oracle 数据库连接与执行错误总结
根据实际操作过程,共遇到4 个典型错误,现总结如下:
错误 1:模块未安装
错误信息:
text
没有名称为 'oracledb' 的模块
原因:
未安装oracledbPython 包
解决方案:
bash
pip install oracledb错误 2:connect() 参数错误
错误信息:
text
TypeError: connect() got an unexpected keyword argument 'encoding'
原因:oracledb的connect()方法不支持encoding参数
解决方案:
python
# 错误写法 config = { "user": "scott", "password": "123456", "dsn": "127.0.0.1:1521/orcl", "encoding": "UTF-8" # 删除此行 } # 正确写法 config = { "user": "scott", "password": "123456", "dsn": "127.0.0.1:1521/orcl" }错误 3:服务名未注册(监听器找不到服务)
解决方法
可以按以下步骤来定位和解决问题:
1. 确认数据库的真实服务名
打开命令提示符(cmd)或 PowerShell,使用 Oracle 自带的
lsnrctl工具来查看服务名。bash
lsnrctl services在命令的输出中,找到状态为
READY的服务实例,它旁边显示的就是你可以用来连接的、正确的服务名。它会像xepdb1或pdb1这样。2. 修正你的连接字符串
找到正确的服务名后,修改代码。
错误信息:
text
DPY-6001: Service "orcl" is not registered with the listener ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
原因:
连接字符串中的服务名orcl与数据库实际注册的服务名不符
诊断方法:
bash
lsnrctl services # 查看数据库实际注册的服务名
确认数据库正在运行:确保你的 Oracle 数据库服务已经成功启动,处于可连接状态。
检查监听器状态:在命令行执行
lsnrctl status,确保监听器正在运行并且没有报错。
输出
C:\Users\86178>lsnrctl services LSNRCTL for 64-bit Windows: Version 21.0.0.0.0 - Production on 22-4月 -2026 10:32:51 Copyright (c) 1991, 2021, Oracle. All rights reserved. 正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MuJinqiu)(PORT=1521))) 服务摘要.. 服务 "57db0fdd4f3b4b59b5325a24da9f6512" 包含 1 个实例。 实例 "xe", 状态 READY, 包含此服务的 2 个处理程序... 处理程序: "N000:dedicated" 已建立:0 已拒绝:0 状态:ready CMON <machine: MUJINQIU, pid: 36336_31144> (ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=4803)) "DEDICATED" 已建立:0 已拒绝:0 状态:ready LOCAL SERVER 服务 "CLRExtProc" 包含 1 个实例。 实例 "CLRExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序... 处理程序: "DEDICATED" 已建立:0 已被拒绝:0 LOCAL SERVER 服务 "XE" 包含 1 个实例。 实例 "xe", 状态 READY, 包含此服务的 2 个处理程序... 处理程序: "N000:dedicated" 已建立:0 已拒绝:0 状态:ready CMON <machine: MUJINQIU, pid: 36336_31144> (ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=4803)) "DEDICATED" 已建立:0 已拒绝:0 状态:ready LOCAL SERVER 服务 "XEXDB" 包含 1 个实例。 实例 "xe", 状态 READY, 包含此服务的 1 个处理程序... 处理程序: "D000" 已建立:0 已被拒绝:0 当前: 0 最大: 1022 状态: ready DISPATCHER <machine: MUJINQIU, pid: 36336_32672> (ADDRESS=(PROTOCOL=tcp)(HOST=MuJinqiu)(PORT=4801)) 服务 "xepdb1" 包含 1 个实例。 实例 "xe", 状态 READY, 包含此服务的 2 个处理程序... 处理程序: "N000:dedicated" 已建立:0 已拒绝:0 状态:ready CMON <machine: MUJINQIU, pid: 36336_31144> (ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=4803)) "DEDICATED" 已建立:0 已拒绝:0 状态:ready LOCAL SERVER 命令执行成功从
lsnrctl services的输出可以看到,你的 Oracle 数据库有多个可用的服务名。其中最常用的是:
XE(大写)
xepdb1(小写,这是可插拔数据库)
关于
SID和SERVICE_NAME这里有个概念需要区分一下:
SID:是数据库实例的唯一标识符,一个实例只有一个SID。
SERVICE_NAME:是数据库对外提供服务时的逻辑名称,一个数据库可以有多个服务名,是更灵活、推荐的连接方式。
解决方案:
python
# 根据 lsnrctl services 输出,使用正确的服务名 config = { "user": "scott", "password": "123456", "dsn": "127.0.0.1:1521/xepdb1" # 或 XE }输出解析示例:
text
服务 "xepdb1" 包含 1 个实例。 # ✅ 可用的服务名 服务 "XE" 包含 1 个实例。 # ✅ 可用的服务名
错误 4:SQL 语法错误(语句未正确结束)
错误信息:
text
ORA-00933: SQL 命令未正确结束
原因:
在 Python 的execute()方法中,SQL 语句末尾不能加分号;(分号是客户端工具的分隔符,不是 SQL 语法的一部分)
解决方案:
python
# 错误写法 cur.execute("SELECT * FROM orders WHERE ROWNUM <= 10;") # ❌ 末尾有分号 # 正确写法 cur.execute("SELECT * FROM orders WHERE ROWNUM <= 10") # ✅ 去掉分号其他注意事项
多语句执行:如果你需要一次执行多个 SQL 语句(例如建表+插入数据),可以使用
cur.executescript()方法,这时才需要分号分隔。ROWNUM 用法正确:你在 Oracle 中使用
ROWNUM <= 10来限制返回行数是正确的。表名确认:确保
orders表在当前用户模式下存在。如果提示表不存在(ORA-00942),可能需要指定所有者,如"SELECT * FROM system.orders"或先授权。
附加错误:用户名/密码错误
确认用户名和密码是否正确
检查是否有大小写问题(Oracle 默认存储用户名是大写的,但通常不区分)
确认密码是否正确
尝试用
BIGDATA_DEV大写用户名连接
代码中的
orders表可能属于其他用户(如system),bigdata_dev需要被授权才能访问如果
bigdata_dev用户确实存在,可能需要重置密码:ALTER USER bigdata_dev IDENTIFIED BY new_password
注意事项
scott 用户可能不存在或未解锁
scott 是 Oracle 示例用户,在 XE 版本中可能默认不存在
如果连接成功但提示用户不存在,需要先创建或解锁 scott
错误信息:
text
ORA-01017: 用户名/口令无效; 登录被拒绝
原因:
用户名或密码输入错误
解决方案:
检查用户名/密码是否正确
确认用户未被锁定:
ALTER USER username ACCOUNT UNLOCK;确认用户有相应权限:
GRANT CONNECT, RESOURCE TO username;
"用户被锁定" 的含义
用户被锁定是 Oracle 数据库的一种安全保护机制。当用户连续多次输入错误密码登录失败后,数据库会自动将该用户账户临时锁定,防止暴力破解密码。
总结
锁定是安全机制:防止暴力破解
默认触发条件:连续 10 次密码错误
解决办法:管理员执行
ALTER USER ... ACCOUNT UNLOCK;预防措施:确保代码中密码配置正确,避免反复用错误密码连接
如果你之前遇到的是
ORA-01017(密码无效),说明账户当时没有被锁定。但如果继续用错误密码尝试多次,账户最终会被锁定,变成ORA-28000。
最终正确代码模板
python
import oracledb as orcl # 正确配置(无 encoding 参数,使用正确的服务名) config = { "user": "your_username", "password": "your_password", "dsn": "127.0.0.1:1521/xepdb1" # 使用 lsnrctl services 查到的服务名 } try: conn = orcl.connect(**config) print("数据库连接成功!") cur = conn.cursor() cur.execute("SELECT * FROM orders WHERE ROWNUM <= 10") # SQL 语句不加分号 res = cur.fetchall() for row in res: print(row) cur.close() conn.close() except orcl.Error as e: print(f"数据库错误: {e}")错误排查流程图
text
安装 oracledb → pip install oracledb ↓ 检查参数 → 移除 encoding 等不支持参数 ↓ 确认服务名 → lsnrctl services → 使用正确的服务名(如 xepdb1) ↓ 确认用户名/密码 → 检查用户状态和权限 ↓ 检查 SQL 语法 → 去掉末尾的分号 ↓ ✅ 成功执行关键要点
| 错误类型 | 核心原因 | 解决方法 |
|---|---|---|
| 模块未安装 | 未安装 oracledb | pip install oracledb |
| 参数错误 | 使用了不支持的参数 | 移除encoding等参数 |
| 服务名错误 | 服务名与数据库不符 | 使用lsnrctl services查看正确服务名 |
| 用户名密码错误 | 认证信息不正确 | 检查用户名/密码/用户状态 |
| SQL 语法错误 | SQL 语句末尾加分号 | 删除 SQL 语句末尾的分号 |
这些是连接 Oracle 数据库时最常见的错误,掌握这些排查方法可以解决大部分连接问题。
补充:刚安装的 Oracle 21c XE,里面也有很多表,是示例用的吗
是的,你看到的这些表是 Oracle 预装的示例模式(Sample Schemas),用于学习和测试,不是数据库运行所必需的。
具体说明如下:
常见示例:最典型的是HR(人力资源)模式,包含
EMPLOYEES、DEPARTMENTS等经典教学表。是否必须:不是必需的。它们是可选的,只为了帮你熟悉 Oracle 特性。删掉它们对数据库核心功能完全没影响。
21c 的变化:以前版本通常默认安装 HR,但在21c XE中,这些示例表可能不会自动创建。如果你看到很多表却认不出来,也可能是在
SYSTEM等系统表空间里,切记不要操作或删除系统表,否则可能导致数据库损坏。
🔍 如何确认你看到的是什么表?
建议你切换到之前创建的BIGDATA_DEV用户连接(而不是 SYSTEM),查看自己 schema 下的表:
sql
-- 查看当前用户下的所有表 SELECT table_name FROM user_tables;orders表是新建的,不是原本就有的
从你的截图可以看到,BIGDATA_DEV用户下目前只有你自己创建的ORDERS这一张表。这说明 Oracle 21c XE 在安装时并没有自动安装那些示例表(比如经典的 HR 员工表)。
🔍 结论分析
之前看到的“很多表”:当你用
SYSTEM等高权限账号登录时,看到的是 Oracle 的系统表(如数据字典表),它们用于管理数据库本身,不是拿来练 SQL 的,也绝对不能动。当前状态:你现在用的
BIGDATA_DEV是一个普通用户,下面只有自己创建的业务表,这才是我们进行开发练习的“干净”环境。
📚 如果你需要 HR 示例表来练习
很多教材(尤其是考证类)会用到经典的EMPLOYEES(员工表)、DEPARTMENTS(部门表)等 HR 模式。如果你确实需要,可以手动安装。