使用Python连接远程Oracle数据库遇ORA-12154错误的解决方法
如何使用Python正确连接远程Oracle数据库(解决ORA-12154错误)
我尝试用cx_Oracle库连接远程Oracle数据库,代码如下:
import cx_Oracle adr = 'server_address' uid = 'user_id' pwd = 'pwd' port = 'port' cx_Oracle.connect(uid + "/" + pwd + "@" + adr)
执行后遇到错误:
cx_Oracle.DatabaseError: ORA-12154: TNS: could not resolve the connect identifier specified
想请教下怎么正确连接远程Oracle数据库?或者有没有cx_Oracle之外的替代工具?
问题分析与解决方案
这个ORA-12154错误其实很常见,核心原因就是Oracle没法识别你给的连接标识符,大概率是连接串格式不对,或者客户端配置有问题,咱们一步步来解决:
1. 先把连接字符串写对
你现在的代码里只传了服务器地址,缺了端口和关键的服务名/实例名,这肯定连不上。给你两种靠谱的写法:
方式一:用官方工具生成DSN
cx_Oracle自带了makedsn()方法,能帮你生成标准的数据源名称,避免手动拼接出错:
import cx_Oracle # 替换成你的真实信息 username = "user_id" password = "pwd" host = "server_address" port = 1521 # Oracle默认端口是1521,要是你的服务器改了就换对应值 service_name = "your_service_name" # 这里要问DBA要正确的服务名,别搞成实例名了 # 生成DSN并连接 dsn = cx_Oracle.makedsn(host, port, service_name=service_name) conn = cx_Oracle.connect(username, password, dsn)
如果你的数据库用的是实例名(SID),那把service_name改成sid就行:
dsn = cx_Oracle.makedsn(host, port, sid="your_sid")
方式二:用简洁的Easy Connect格式
要是你的Oracle客户端版本在11g及以上,直接用这种短格式更省事:
conn = cx_Oracle.connect(f"{username}/{password}@{host}:{port}/{service_name}")
2. 检查Oracle客户端配置
要是连接串改对了还是报错,就得看看本地的Oracle客户端了:
- 首先得装和cx_Oracle版本匹配的Oracle客户端,别乱装版本;
- 要是用TNS别名连接,得确保
tnsnames.ora里配置了正确的远程数据库信息; - 环境变量
ORACLE_HOME和PATH必须指向你的Oracle客户端安装目录,不然Python找不到客户端。
3. 替代工具推荐
不想用cx_Oracle的话,推荐试试oracledb——这是cx_Oracle的官方后继版本,Oracle自己维护的,用法几乎和cx_Oracle一样,还支持不用装Oracle客户端的薄模式,对新手友好太多:
import oracledb conn = oracledb.connect( user="user_id", password="pwd", host="server_address", port=1521, service_name="your_service_name" )
另外如果是用ORM的话,SQLAlchemy搭配cx_Oracle/oracledb也很方便,连接字符串这么写:
from sqlalchemy import create_engine engine = create_engine(f"oracle+cx_oracle://{username}:{password}@{host}:{port}/{service_name}")
最后验证下连接
连接成功后可以跑个简单的查询确认下:
cursor = conn.cursor() cursor.execute("SELECT sysdate FROM dual") print(f"数据库当前时间:{cursor.fetchone()[0]}") # 用完记得关闭资源 cursor.close() conn.close()
内容的提问来源于stack exchange,提问作者user6133328
相关产品推荐
相关产品推荐

