мы успешно использовали 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.
Вышеизложенное очень полезно... но я надеялся, что мне не придется заниматься кошельком на моей машине.
Это единственный способ сделать TCPS (TLS): для этого по определению требуются клиентские сертификаты.
Упомянутый пример кода (тот, который использует cx_Oracle) не нуждается в кошельке. Вы говорите, что sqlalchemy с tcps требует клиентских сертификатов по определению?
В примере показано создание кошелька с использованием сертификата, полученного от администратора баз данных. TCPS всегда требует сертификатов.
Отвечает ли это на ваш вопрос? Python подключается к базе данных Oracle с помощью TCPS
@ljmc, это буквально та же ссылка, что и в первом комментарии.
@pmdba, я пометил вопрос вашей ссылкой, так как вы этого не сделали, это автоматический комментарий, добавленный флажком. Он будет удален, если вопрос будет закрыт как дубликат.
К сожалению, указанная ссылка не отвечает на мой вопрос. Проделав все шаги со ссылкой на кошелек, описанный в ссылке, я все еще не могу подключиться к оракулу с помощью sqlalchemy. Я обновлю вопрос с моими выводами.
Чтобы использовать шифрование оракула с 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=)))
Отвечает ли это на ваш вопрос? stackoverflow.com/questions/66094119/…