升级Oracle XE 11g到21c后Django无法连接TNS监听器问题求助
问题核心原因
- 监听器的1521端口仅绑定在主机名
centos8对应的网络接口,没有绑定127.0.0.1环回接口,你配置中HOST字段填了127.0.0.1,直接访问127.0.0.1:1521不存在监听服务,所以抛出ORA-12541错误。 - Django 1.10的Oracle后端逻辑会自动拼接
HOST、PORT、NAME生成TNS连接串,你在NAME中额外填写了主机名,会导致最终生成的连接串格式错误。 - 配置中存在笔误
CONN_MAX_AG,正确字段名为CONN_MAX_AGE(虽然该字段不影响连接逻辑,建议修正)。
解决方案
方案1:按Django标准配置规则修改(推荐)
仅保留服务名在NAME字段,修改HOST为监听器绑定的主机名:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.oracle', 'NAME': 'XEPDB1', 'PORT' : '1521', 'HOST' : 'centos8', 'USER' : 'raxak3', 'PASSWORD' : '*****', 'CONN_MAX_AGE' : None, 'OPTIONS' : { 'threaded' : True, } } }
方案2:使用Easy Connect命名格式
删除HOST、PORT字段,直接将完整易连接串填入NAME字段,Django会直接使用该串作为连接DSN:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.oracle', 'NAME': 'centos8:1521/XEPDB1', 'USER' : 'raxak3', 'PASSWORD' : '*****', 'CONN_MAX_AGE' : None, 'OPTIONS' : { 'threaded' : True, } } }
验证方式
修改配置后先执行python3 manage.py dbshell,若能直接进入Oracle命令行则说明配置正确,再执行migrate操作即可。
内容的提问来源于stack exchange,提问作者Prasanna
相关产品推荐
相关产品推荐

