Python下载第三方库:requests、oracledb,连接 Oracle 数据库,测试数据输出(切记不要操作或删除系统表)

文章详细记录了在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_venvLib/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


你现在可以这样使用:

python 复制代码
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 XEPython 3.13.13 可以配合使用,官方驱动 python-oracledb 明确支持这一组合。


只需在你的终端(如命令提示符或 PowerShell)执行以下命令即可完成安装:

bash

bash 复制代码
pip 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 数据库,获得代码补全功能:

  1. 右侧边栏Database 工具窗口

  2. 点击 +Data SourceOracle

  3. 填写连接信息:

    • Host: 127.0.0.1

    • Port: 1521

    • Service/SID: orcl

    • User: bigdata_dev

    • Password: dev123

  4. 点击 Test Connection 测试

  5. 应用并确定


配置成功后,PyCharm 就能识别表名、字段名,并提供智能提示。


Oracle 数据库连接与执行错误总结


根据实际操作过程,共遇到 4 个典型错误,现总结如下:


错误 1:模块未安装


错误信息:

text

复制代码
没有名称为 'oracledb' 的模块

原因:

未安装 oracledb Python 包

解决方案:

bash

bash 复制代码
pip install oracledb

错误 2:connect() 参数错误


错误信息:

text

复制代码
TypeError: connect() got an unexpected keyword argument 'encoding'

原因:
oracledbconnect() 方法不支持 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

bash 复制代码
lsnrctl services

在命令的输出中,找到状态为 READY 的服务实例,它旁边显示的就是你可以用来连接的、正确的服务名。它会像 xepdb1pdb1 这样。


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 (小写,这是可插拔数据库)

关于 SIDSERVICE_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")   # ✅ 去掉分号

其他注意事项
  1. 多语句执行 :如果你需要一次执行多个 SQL 语句(例如建表+插入数据),可以使用 cur.executescript() 方法,这时才需要分号分隔。

  2. ROWNUM 用法正确 :你在 Oracle 中使用 ROWNUM <= 10 来限制返回行数是正确的。

  3. 表名确认 :确保 orders 表在当前用户模式下存在。如果提示表不存在(ORA-00942),可能需要指定所有者,如 "SELECT * FROM system.orders" 或先授权。

附加错误:用户名/密码错误


确认用户名和密码是否正确

  • 检查是否有大小写问题(Oracle 默认存储用户名是大写的,但通常不区分)

  • 确认密码是否正确

  • 尝试用 BIGDATA_DEV 大写用户名连接

  • 代码中的 orders 表可能属于其他用户(如 system),bigdata_dev 需要被授权才能访问

  • 如果 bigdata_dev 用户确实存在,可能需要重置密码ALTER USER bigdata_dev IDENTIFIED BY new_password

注意事项

  1. scott 用户可能不存在或未解锁

    • scott 是 Oracle 示例用户,在 XE 版本中可能默认不存在

    • 如果连接成功但提示用户不存在,需要先创建或解锁 scott

错误信息:

text

复制代码
ORA-01017: 用户名/口令无效; 登录被拒绝

原因:

用户名或密码输入错误

解决方案:

  1. 检查用户名/密码是否正确

  2. 确认用户未被锁定:ALTER USER username ACCOUNT UNLOCK;

  3. 确认用户有相应权限: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 (人力资源)模式,包含 EMPLOYEESDEPARTMENTS 等经典教学表。

  • 是否必须不是必需的。它们是可选的,只为了帮你熟悉 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 模式。如果你确实需要,可以手动安装。

相关推荐
weixin_441003642 小时前
python编程从入门到实践第三版pdf免费下载
python·pdf
四维迁跃2 小时前
HTML5中SVG利用Javascript实现图形拖拽与缩放
jvm·数据库·python
我们的五年2 小时前
mysql报错,net_async_status
数据库·mysql·adb
hINs IONN2 小时前
在Mysql环境下对数据进行增删改查
数据库·mysql
Chuer_2 小时前
AI For BI是什么?一文拆解AI For BI应用落地!
大数据·数据库·人工智能·安全·数据分析·甘特图
深度红薯2 小时前
SAM3:开放式分割,太强了(后面有SAM3权重下载方式)(单图测试、视频测试、实时跟踪)
图像处理·人工智能·python·深度学习·毕业设计·毕设·sam3
一颗青果2 小时前
数据库事务
数据库·oracle
weixin_424999362 小时前
html如何修改备注
jvm·数据库·python
21439652 小时前
HTML怎么创建时间轴布局_HTML结构化时间线写法【方法】
jvm·数据库·python