You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修复cx_Oracle.DatabaseError: ORA-12514: TNS监听器错误

修复cx_Oracle连接Oracle时的ORA-12514错误

我来帮你一步步解决这个ORA-12514的问题,先从几个关键的地方排查:

1. 先修正你的tnsnames.ora配置

你的.ORA文件里PORT字段是空的,Oracle默认的监听端口是1521,这是监听器找不到服务的核心原因之一。修改后的配置应该是:

myservice = (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp) (HOST=localhost) (PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=orcl)))

另外要确保这个文件放在Oracle客户端能识别的路径下:比如你安装的Oracle Instant Client的network/admin目录,或者设置系统环境变量TNS_ADMIN指向这个文件所在的文件夹。

2. 修正Python代码里的低级拼写错误

你的代码里有两处明显的拼写问题:

  • 把连接对象con写成了conncur= conn.cursor()这一行)
  • 表名employess多了一个s,应该是employees
    这些错误会导致后续执行报错,先把它们改掉。

3. 调整数据库连接字符串的写法

推荐两种可靠的连接方式,选一种就行:

方式一:使用配置好的TNS名称连接

如果已经正确配置了tnsnames.ora,直接用你定义的myservice作为连接参数:

import cx_Oracle
# 分别传入用户名、密码、TNS名称
con = cx_Oracle.connect("db_employees", "root", "myservice")
cur = con.cursor()
cur.execute('select * from employees')
for line in cur:
    print(line)
cur.close()
con.close()

方式二:直接在代码中构建DSN连接

不想配置TNS文件的话,可以用cx_Oracle.makedsn直接生成连接串:

import cx_Oracle
# 生成DSN:主机、端口、服务名
dsn = cx_Oracle.makedsn("localhost", 1521, service_name="orcl")
con = cx_Oracle.connect("db_employees", "root", dsn)
cur = con.cursor()
cur.execute('select * from employees')
for line in cur:
    print(line)
cur.close()
con.close()

4. 额外的必要检查

  • 确认Oracle监听器服务是启动状态:在Windows服务列表里找到OracleOraDb11g_home1TNSListener,确保它正在运行。
  • 匹配位数:你的Python是32位,对应的Oracle客户端也必须是32位的,不然会出现兼容性问题(cx_Oracle版本也要和Python、Oracle客户端的位数匹配)。
  • 用SQL*Plus测试连接:先试试用sqlplus db_employees/root@localhost:1521/orcl能不能正常连接,如果连不上,那问题出在数据库或监听器配置,先解决这个基础问题。

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

火山引擎 最新活动