You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python oracledb连接Oracle数据库失败:[Errno -2]名称或服务未知

解决python-oracledb连接Oracle时的[Errno -2] Name or service not known错误

核心问题定位

这个错误本质是WSL环境无法解析Oracle数据库的主机名,SQL Developer能正常连接是因为它运行在虚拟机(或Windows主机)环境,网络DNS配置和WSL完全独立。

解决方案

1. 修复WSL的DNS配置(避免手动修改被覆盖)

WSL 2的/etc/resolv.conf是自动生成的,手动修改会被WSL重启覆盖,需通过配置文件固定:

  • 创建/编辑/etc/wsl.conf:
    sudo nano /etc/wsl.conf
    
    写入以下内容:
    [network]
    generateResolvConf = false
    
  • 关闭所有WSL终端,在Windows命令行执行:
    wsl --shutdown
    
  • 重新打开WSL终端,编辑/etc/resolv.conf添加公司内网DNS服务器:
    sudo nano /etc/resolv.conf
    
    替换为:
    nameserver 你的公司DNS服务器IP
    nameserver 8.8.8.8  # 备用公共DNS
    
  • 执行ping <Oracle数据库主机名>,确认能正常解析到IP地址。

2. 直接使用数据库IP替代主机名

如果DNS解析问题无法快速解决,跳过主机名解析,直接在代码中使用数据库IP:

import oracledb

# 方式1:字符串拼接DSN(服务名)
conn = oracledb.connect(
    user="你的用户名",
    password="你的密码",
    dsn="192.168.x.x:1521/ORCL"  # 替换为实际IP、端口、服务名
)

# 方式2:使用makedsn函数(SID)
dsn = oracledb.makedsn("192.168.x.x", 1521, sid="ORCL")
conn = oracledb.connect(user="你的用户名", password="你的密码", dsn=dsn)

3. 区分Oracle服务名(Service Name)和SID

连接失败常因混淆两者格式:

  • 服务名:DSN格式为host:port/service_name,makedsn函数需指定service_name参数
  • SID:DSN格式为host:port:sid(注意最后一段是冒号分隔),makedsn函数需指定sid参数
  • 对照SQL Developer的连接属性,确认你使用的是服务名还是SID,保持代码参数完全一致。

4. 检查WSL的网络路由与VPN连通性

  • 执行traceroute <Oracle数据库主机名>,查看数据包是否能到达目标网络节点
  • 确认VPN连接在WSL中生效:部分VPN软件需要手动配置允许WSL访问,或在WSL中重新连接VPN(如果支持命令行操作)

内容的提问来源于stack exchange,提问作者Jackalakalaka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:58:25