使用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.confnameserver 你的公司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
相关产品推荐
相关产品推荐

