Я хочу подключить Python к локальному Oracle с помощью cx_Oracle. Я знаю, что для установления соединения я должен знать локальный IP-адрес, порт и SID. Таким образом, я получаю эту информацию через следующие шаги:
локальный IP:
import socket
#get local IP:
localhost = socket.gethostbyname(socket.gethostname())
порт:
Это из моего listener.ora , поэтому я использую порт 1521.
# listener.ora Network Configuration File: C:\app\413022472\product\12.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\app\413022472\product\12.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\app\413022472\product\12.2.0\dbhome_1\bin\oraclr12.dll")
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-2RE9AJU.local)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
DEFAULT_SERVICE_LISTENER = (orcl)
sid : Это меня очень беспокоит. Я много пробовал, но до сих пор не могу получить правильный sid. Это из моего tnsnames.ora :
# tnsnames.ora Network Configuration File: C:\app\413022472\product\12.2.0\dbhome_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.
LISTENER_ORCL =
(ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-2RE9AJU.local)(PORT = 1521))
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
Это то, что я получил при запуске select instance_name from v$instance;
в sqlplus :
INSTANCE_NAME
--------------------------------
orcl
Я попробовал следующее:
import cx_Oracle
import socket
#get local IP:
localhost = socket.gethostbyname(socket.gethostname())
#generate dsn:
dsn = cx_Oracle.makedsn(localhost, '1521', service_name = 'orcl')
#make connection:
conn = cx_Oracle.connect("c##scott", "tiger", dsn)
Что дает мне: DatabaseError:ORA-12514, TNS:listener does not currently know of service requested in connect descriptor
я тоже пробовал dsn = cx_Oracle.makedsn(localhost, '1521', sid = 'orcl')
Что дает мне: ORA-12505: TNS:listener does not currently know of SID given in connect descriptorD
Я должен сказать, что я изменил текст в listener.ora и tnsnames.ora, но я не могу вспомнить детали. Может ли кто-нибудь помочь мне сделать соединение успешным?