使用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有差异,尝试以下两种写法:
- 使用
DBQ参数组合主机、端口和服务名:conn = pyodbc.connect('DRIVER={Oracle in OraClient19Home1};DBQ=xxxxxx.yyy.com:1521/myservicename;UID=myuserid;PWD=mypassword') - 采用完整的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客户端配置:
- 检查Oracle客户端的
tnsnames.ora文件是否正确配置了目标服务名,确保文件路径在TNS_ADMIN环境变量中。 - 若不想依赖
tnsnames.ora,可直接在连接字符串中指定完整的TNS信息(如上述第二种写法)。
- 检查Oracle客户端的
设置环境变量:确保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
相关产品推荐
相关产品推荐

