Подключиться к Oracle через зашифрованный порт с помощью sqlalchemy

мы успешно использовали sqlalchemy для подключения к Oracle. Только что наша организация переходит на зашифрованную базу данных Oracle, и нас попросили переключиться на зашифрованную базу данных.

Пример кода, предоставленный мне командой инженеров базы данных, напрямую использует cx_Oracle:

import cx_Oracle
dsn = """(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcps)(HOST=test_host)(PORT=1531)))
(CONNECT_DATA=(SERVICE_NAME=test_service)))"""
connection = cx_Oracle.connect(user = "test", password = "test", dsn=dsn, encoding = "UTF-8")

Однако, когда я пытаюсь подключиться к базе данных с помощью sqlalchemy, используя: oracle+cx_oracle://test:test@test_host:1531/test_service

Я получаю сообщение об ошибке: (cx_Oracle.DatabaseError) ORA-12547: TNS:lost contact\n(Background on this error at: http://sqlalche.me/e/13/4xp6)

Подозреваю, что нужно ставить именно протокол tcps.

Я попробовал следующую строку подключения: protocol_url = 'oracle+cx_oracle://test:test@test_host:1531?service_name=test_service&protocol=tcps'

Я получаю следующую ошибку: ValueError: invalid literal for int() with base 10: '1531?service_name=test_service&protocol=tcps'

Есть ли способ использовать sqlalchemy для подключения к Oracle через зашифрованный порт?

Обновлено: я выполнил шаги, перечисленные в Подключение Python к базе данных Oracle с помощью TCPS Я все еще получаю сообщение об ошибке: sqlalchemy.exc.DatabaseError: (cx_Oracle.DatabaseError) ORA-12547: TNS: потерянный контакт

ПРИМЕЧАНИЕ. Я знаю, что могу успешно подключиться к Oracle с шифрованием, используя прямое соединение cx_Oracle.

Отвечает ли это на ваш вопрос? stackoverflow.com/questions/66094119/…

pmdba 04.01.2023 22:56

Вышеизложенное очень полезно... но я надеялся, что мне не придется заниматься кошельком на моей машине.

Krish Srinivasan 04.01.2023 23:09

Это единственный способ сделать TCPS (TLS): для этого по определению требуются клиентские сертификаты.

pmdba 04.01.2023 23:14

Упомянутый пример кода (тот, который использует cx_Oracle) не нуждается в кошельке. Вы говорите, что sqlalchemy с tcps требует клиентских сертификатов по определению?

Krish Srinivasan 04.01.2023 23:20

В примере показано создание кошелька с использованием сертификата, полученного от администратора баз данных. TCPS всегда требует сертификатов.

pmdba 04.01.2023 23:22

Отвечает ли это на ваш вопрос? Python подключается к базе данных Oracle с помощью TCPS

ljmc 05.01.2023 00:22

@ljmc, это буквально та же ссылка, что и в первом комментарии.

pmdba 05.01.2023 04:40

@pmdba, я пометил вопрос вашей ссылкой, так как вы этого не сделали, это автоматический комментарий, добавленный флажком. Он будет удален, если вопрос будет закрыт как дубликат.

ljmc 05.01.2023 08:32

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

Krish Srinivasan 05.01.2023 18:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
9
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Чтобы использовать шифрование оракула с sql alchemy, необходимо сделать следующее:

а) Следуйте инструкциям по настройке клиентского компьютера, как описано в ответе на вопрос: Python подключается к базе данных Oracle с помощью TCPS

б) Затем используйте DSN, как указано в ответе на этот вопрос: Использование имен служб Oracle с SQLAlchemy

Со своей стороны, мне нужно было сделать и а), и б). Некоторые из вас, использующих sqlalchemy, возможно, уже указали DSN в нужном формате. engine = create_engine("oracle+cx_oracle://:@(DESCRIPTION = (LOAD_BALANCE=on) (FAILOVER=ON) (ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1521)) (CONNECT_DATA = (SERVER = ПОСВЯЩЕННЫЙ) (ИМЯ_СЛУЖБЫ = devdb)))")

Главное здесь то, что формат DSN я использовал :
oracle+cx_oracle://:@:/test_db не позволяет указать протокол как TCPS, что также требуется.

Ответ принят как подходящий

Поскольку вы используете Python/SQLAlchemy, вы можете использовать create_engine. Мой питон код создает строку подключения, а затем вызывает create_engine следующим образом:

dsnStr = cx_Oracle.makedsn(config[args.tier]['oracle_host'], config[args.tier]['oracle_port'],config[args.tier]['oracle_sid'],
    config[args.tier]['oracle_service'])
dsnStr = dsnStr.replace('TCP', config[args.tier]['oracle_protocol'])
oracle_conn_str = "oracle://" + config[args.tier]['username'] + ":" + config[args.tier]['password'] + "@" + dsnStr
engine = create_engine(oracle_conn_str, connect_args = { "encoding": "UTF-8", "nencoding": "UTF-8"})

В моем коде я прочитал файл конфигурации (через configparser), в котором oracle_protocol указан как TCPS.

dsnStr для меня было:

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=REDACTED)(PORT=1923))(CONNECT_DATA=(SID=REDACTED)(SERVICE_NAME=)))

В итоге oracle_conn_str для меня было:

oracle://rumali:REDACTED@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=REDACTED)(PORT=1923))(CONNECT_DATA=(SID=REDACTED)(SERVICE_NAME=)))

Другие вопросы по теме