文章详细记录了在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
bash
pip list
应该能看到 requests 在列表中。
bash
(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。
你现在可以这样使用:
pythonimport 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
bashpip install oracledb --upgrade⚙️ 两种连接模式
安装后,你有两种方式连接数据库,推荐优先尝试 Thin 模式:
Thin 模式 (推荐新手) :这是驱动默认的模式,无需安装 Oracle 客户端,直接用 Python 代码就能连接,非常简单省事。前提是数据库版本需为 12.1 或更高(你的 21c 完全满足)。
Thick 模式 (高级功能) :如果需要用到 Oracle 的一些高级功能(如 AQ 消息队列),则需额外下载 Oracle Instant Client 并配置环境变量,连接时需切换到此模式。
以下是运行成功的完整示例
python
#第三方模块 安装 打开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)中的语句分隔符,但在编程接口中直接传入会报错。
输出
bash
数据库连接成功!
(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' 的模块
原因:
未安装 oracledb Python 包
解决方案:
bash
bash
pip install oracledb
错误 2:connect() 参数错误
错误信息:
text
TypeError: connect() got an unexpected keyword argument 'encoding'
原因:
oracledb 的 connect() 方法不支持 encoding 参数
解决方案:
python
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
bashlsnrctl 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
bash
lsnrctl services # 查看数据库实际注册的服务名
确认数据库正在运行:确保你的 Oracle 数据库服务已经成功启动,处于可连接状态。
检查监听器状态 :在命令行执行
lsnrctl status,确保监听器正在运行并且没有报错。
输出
bash
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
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
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
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
python
安装 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
sql
-- 查看当前用户下的所有表
SELECT table_name FROM user_tables;

orders表是新建的,不是原本就有的
从你的截图可以看到,BIGDATA_DEV 用户下目前只有你自己创建的 ORDERS 这一张表 。这说明 Oracle 21c XE 在安装时并没有自动安装那些示例表(比如经典的 HR 员工表)。
🔍 结论分析
-
之前看到的"很多表" :当你用
SYSTEM等高权限账号登录时,看到的是 Oracle 的系统表 (如数据字典表),它们用于管理数据库本身,不是拿来练 SQL 的,也绝对不能动。 -
当前状态 :你现在用的
BIGDATA_DEV是一个普通用户,下面只有自己创建的业务表,这才是我们进行开发练习的"干净"环境。
📚 如果你需要 HR 示例表来练习
很多教材(尤其是考证类)会用到经典的 EMPLOYEES(员工表)、DEPARTMENTS(部门表)等 HR 模式。如果你确实需要,可以手动安装。