在使用Django连接Oracle数据库时,遇到报错:
cx_Oracle.DatabaseError: ORA-12505: TNS:listener does not currently know of SID given in connect descriptor
在网上查找了很多方法,都没能解决,后来在一遍连接教程中设置连接参数的描述中找到了答案:
如果数据库的tnsnames.ora文件的网络配置中设置了SERVICE_NAME,那么在settings.py文件中设置数据库连接参数时,
就不能同时设置NAME属性和HOST以及PORT属性,也就是下面这种做法:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'oratest1',# 这里如果指定了数据库的NAME,也就是nsnames.ora文件中的SERVICE_NAME,那么下面的HOST以及PORT就需要注释掉
'USER': 'aaaaa',
'PASSWORD': 'xxxxx',
#'HOST': 'oratest1.******.com',# 这行需要注释掉
#'PORT': '1521'# 这行也需要注释掉
}
}
ORATEST1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oratest1.******.com)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = oratest1) # 这里设置的连接数据库的SERVER_NAME
)
)
验证是否连接成功:
在PyCharm的Terminal终端下输入以下命令:(如果没有任何报错则表明连接成功)
(venv) D:\PythonTest\DJ>python manage.py shell
>>> from django.db import connection
>>> con = connection.cursor()
>>> con.close()
>>>
附:
开发环境:
Python版本:Python 3.6.3 - 64bit
Oracle版本:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL版本:PL/SQL Release 11.2.0.4.0 - Production
cx_Oracle版本:6.2.1
Django版本:2.0.4