如何修复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写成了conn(cur= 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




