cx_Oracle Я неправильно использую имя хоста? - PullRequest
0 голосов
/ 01 февраля 2019

Я использую Toad для подключения к своей базе данных Oracle, и это работает нормально, однако я пытаюсь использовать cx_Oracle для подключения к той же базе данных, и моя программа застревает в методе .connect().

Я считаю,проблема в имени host, но я не могу быть уверен, что никаких ошибок не существует, просто не проходит вызов connect().

import cx_Oracle


CONN_INFO = {'host': '\\\\SERVERNAMEUSEDINTOAD\\',
             'port': 1111,
             'user': 'USER123',
             'psw': 'password',
             'service': 'dbname.somesite.com'}
print("test1")
CONN_STR = '{user}/{psw}@{host}:{port}/{service}'.format(**CONN_INFO)
print("test2")
con = cx_Oracle.connect(CONN_STR)
print("test3")
print(con.fetchmany([1]))

Консоль:

test1
test2

Я делаю этодо test2, но не test3.Я правильно использую имя хоста?Хост является внутренним сервером в сети.

Приложение TOAD отображает только SERVERNAMEUSEDINTOAD, поэтому я тоже попробовал:

'host': 'SERVERNAMEUSEDINTOAD'

Но это привело к следующей ошибке:

test1
test2
Traceback (most recent call last):
  File "C:/Users/name/PycharmProjects/WorkFlow/test.py", line 12, in <module>
    con = cx_Oracle.connect(CONN_STR)
cx_Oracle.DatabaseError: ORA-12154: TNS:could not resolve the connect identifier specified

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Мне пришлось сделать две вещи, чтобы ваш пример работал на моем ноутбуке.

Мне пришлось обновить свой sqlnet.ora, чтобы получить эту строку:

names.directory_path = (TNSNAMES, EZCONNECT)

вместо

names.directory_path = (TNSNAMES)

Затем мне пришлось использовать IP-адрес для моего хоста вместо имени хоста.

Я не думаю, что это ошибка в cx_oracle, потому что sqlplus также не работал с тем же синтаксисом.Но он работал с IP-адресом и EZCONNECT в моем sqlnet.ora.

Бобби

0 голосов
/ 02 февраля 2019

После некоторого копания я нашел этот пост:

cx_Oracle не подключается при использовании SID вместо имени службы в строке подключения .

Думал, что это было примернопри соединении с SID было сообщение, в котором предлагалось использовать makedsn(), а затем использовать его для подключения.

Оказалось, что это решило и мою проблему с подключением через service_name.

Яопубликовать мое решение здесь, чтобы у любого, кто найдет это сообщение, была возможность решить эту проблему.

import cx_Oracle

or_dns = cx_Oracle.makedsn('SERVERNAMEUSEDINTOAD', 1111, service_name='dbname.somesite.com')

con = cx_Oracle.connect(user="USER123", password="password", dsn=or_dns)
print(con)

Консоль:

<cx_Oracle.Connection to USER123@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=SERVERNAMEUSEDINTOAD)(PORT=1111))(CONNECT_DATA=(SERVICE_NAME=dbname.somesite.com)))>
...