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

使用pyodbc连接Oracle数据库报错ORA-12560求助

问题描述

我尝试用pyodbc连接Oracle数据库,代码如下:

import pyodbc
conn=pyodbc.connect('DRIVER={Oracle in OraClient19Home1};Host=xxxxxx.yyy.com;Port=1521;Service Name=myservicename;User ID=myuserid;Password=mypassword')

执行时报错:

Traceback (most recent call last):
  File "c:\Users\xxxxxxxx\OneDrive - xxxxxxxxxxxxxxxxxxxxx\Documents\Data Analytics\Python Training\python", line 2, in <module>
    conn=pyodbc.connect('DRIVER={Oracle in OraClient19Home1};Host=xxxxxx.yyy.com;Port=1521;Service Name=myservicename;User ID=myuserid;Password=mypassword')
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pyodbc.Error: ('HY000', '[HY000] [Oracle][ODBC][Ora]ORA-12560: TNS:protocol adapter error\n (12560) (SQLDriverConnect); [HY000] [Oracle][ODBC][Ora]ORA-12560: TNS:protocol adapter error\n (12560)')

注:相同连接参数在Ms Access和Ms Power BI中可正常连接。

解决方向
  • 检查位数匹配:确认Python的位数(32/64位)与Oracle ODBC驱动的位数完全一致。PowerBI和Access可能自动适配了对应位数的驱动,但Python运行环境如果位数不匹配,会触发协议适配器错误。可以通过python --version查看Python位数,再在ODBC数据源管理器的对应标签(32位需运行%windir%\SysWOW64\odbcad32.exe,64位用%windir%\System32\odbcad32.exe)中确认驱动位数。

  • 调整连接字符串格式:pyodbc对Oracle连接参数的解析可能和Access/PowerBI有差异,尝试以下两种写法:

    1. 使用DBQ参数组合主机、端口和服务名:
      conn = pyodbc.connect('DRIVER={Oracle in OraClient19Home1};DBQ=xxxxxx.yyy.com:1521/myservicename;UID=myuserid;PWD=mypassword')
      
    2. 采用完整的TNS描述符格式:
      conn_str = '''DRIVER={Oracle in OraClient19Home1};
                    CONNECT_DATA=(SERVICE_NAME=myservicename);
                    ADDRESS=(PROTOCOL=TCP)(HOST=xxxxxx.yyy.com)(PORT=1521);
                    UID=myuserid;PWD=mypassword'''
      conn = pyodbc.connect(conn_str)
      
  • 验证Oracle客户端配置:

    1. 检查Oracle客户端的tnsnames.ora文件是否正确配置了目标服务名,确保文件路径在TNS_ADMIN环境变量中。
    2. 若不想依赖tnsnames.ora,可直接在连接字符串中指定完整的TNS信息(如上述第二种写法)。
  • 设置环境变量:确保Python运行时能读取到Oracle客户端的环境变量,可在代码开头添加:

    import os
    os.environ['ORACLE_HOME'] = 'C:\\path\\to\\OraClient19Home1'  # 替换为你的Oracle客户端路径
    os.environ['PATH'] = os.path.join(os.environ['ORACLE_HOME'], 'bin') + ';' + os.environ['PATH']
    
  • 测试ODBC数据源:在ODBC数据源管理器中创建系统DSN,使用相同的连接参数测试连接。若成功,用Python连接该DSN:

    conn = pyodbc.connect('DSN=你的DSN名称;UID=myuserid;PWD=mypassword')
    

    若此方式能连接,说明原连接字符串的参数写法存在兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:35:25