使用Python oracledb连接Oracle数据库遇ORA-28759等错误求助
解决oracledb连接Oracle时的ORA-28759与DPY-6000错误
针对ORA-28759: failure to open file的排查与修复
检查钱包配置与路径
ORA-28759通常和Oracle Wallet文件的访问或路径配置有关,即使确认有读写权限,也需要:- 确认
tnsnames.ora中的WALLET_LOCATION参数指向的目录包含cwallet.sso和ewallet.p12文件,路径不能有拼写错误或特殊字符。 - 在代码中显式指定TNS_ADMIN和配置目录,确保oracledb能找到钱包和tns配置:
import os import oracledb # 设置TNS_ADMIN指向包含tnsnames.ora和钱包的目录 os.environ['TNS_ADMIN'] = r"C:\your\wallet_and_tns_directory" # 初始化客户端时指定lib_dir和config_dir oracledb.init_oracle_client( lib_dir=r"C:\oracle\instantclient_18_5", config_dir=r"C:\your\wallet_and_tns_directory" ) dbadw = """###fromtnsnames""" connx = oracledb.connect( user='my_user', password='my_password', dsn=dbadw, encoding="UTF-8" ) c = connx.cursor()
- 确认
验证Instant Client版本兼容性
确保你使用的18.5版本Instant Client与目标Oracle数据库版本兼容:- Oracle官方要求Instant Client版本不低于数据库版本,或支持向下兼容(例如18c客户端可连接19c数据库,但21c数据库建议用21c或更高版本的客户端)。
- 若版本不匹配,下载对应版本的Instant Client(无需管理员权限,解压到本地目录即可),替换
lib_dir路径。
针对DPY-6000: Listener refused connection的修复
尝试使用oracledb的Thin模式连接,无需初始化Oracle Client,适合无管理员权限场景:
import oracledb # 使用Easy Connect字符串(替换为你的数据库主机、端口、服务名和SSL信息) dsn = """(description= (retry_count=20)(retry_delay=3) (address=(protocol=tcps)(port=1521)(host=your-db-host)) (connect_data=(service_name=your-service-name)) (security=(ssl_server_cert_dn="CN=your-cert-dn")) )""" # 带钱包的连接(钱包目录包含cwallet.sso) connx = oracledb.connect( user='my_user', password='my_password', dsn=dsn, encoding="UTF-8", wallet_location=r"C:\path\to\your\wallet_folder" ) c = connx.cursor()
如果钱包是自动登录模式(存在cwallet.sso),可省略账号密码,直接通过钱包连接:
connx = oracledb.connect( dsn=dsn, wallet_location=r"C:\path\to\your\wallet_folder", encoding="UTF-8" )
解决cx_Oracle安装问题(可选)
若需使用cx_Oracle,无需安装Microsoft Visual C++,直接下载对应Python版本和系统的预编译wheel包,本地安装:
- 找到匹配的wheel文件(例如
cx_Oracle-8.3.0-cp310-cp310-win_amd64.whl) - 使用本地pip安装:
pip install C:\path\to\downloaded\cx_Oracle-xxx.whl
内容的提问来源于stack exchange,提问作者Martin Beraldo
相关产品推荐
相关产品推荐

