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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:15:34