Невозможно подключить Python к Oracle - PullRequest
0 голосов
/ 03 мая 2018

Я хочу подключить 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, но я не могу вспомнить детали. Может ли кто-нибудь помочь мне сделать соединение успешным?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

У слушателей есть много вещей, которые влияют на создание соединения. Ниже приведено содержимое файла «listener.ora» в соответствии с моей системой. Перед этим убедитесь, что ваше имя хоста является действительным или нет, используя «имя хоста» в командной строке. Перед заменой содержимого файла слушателя берет копию существующего файла listener.ora. После того, как вы изменили файл listener.ora, перезапустите слушатель и службу Oracle.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1)) 
      (ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-2RE9AJU.local)(PORT = 1521))
    )
  )


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")
    )
   (SID_DESC = 
      (GLOBAL_DBNAME = orcl.com)
      (ORACLE_HOME =C:\app\413022472\product\12.2.0\dbhome_1)
      (SID_NAME = orcl)
    )

  )

DEFAULT_SERVICE_LISTENER = (orcl)
0 голосов
/ 03 мая 2018

Я бы использовал фрагмент из этого руководства по Oracle (не забудьте изменить пользователя / передать соответственно).

import cx_Oracle
con = cx_Oracle.connect('pythonhol/welcome@127.0.0.1/orcl')
print con.version
con.close()

enter image description here

Вот ссылка на официальную документацию cx_Oracle .

И, наконец, на этом URL GitHub вы можете найти несколько обновленных примеров, которые могут помочь ускорить вашу работу.

Веселитесь, счастливого взлома!

...