Python 3.6: проблемы с изменением сервиса при подключении к базе данных Oracle 11 (модуль cx_Oracle) - PullRequest
0 голосов
/ 05 апреля 2019

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

Кажется, что каким-то образом первое соединение "сохраняется", даже если удалить объект или создать новое соединение в дочернем процессе.Поэтому, когда я пытаюсь установить соединение с другой службой, возникает «ORA-01017: неверное имя пользователя / пароль; вход в систему запрещен»

Я использую кошелек для организации соединения.

  class Connection(object):
    def __init__(self,oracle_user,instance=os.environ["ORACLESRV"],env=os.environ["ENVPURPOSE"]):
        self.oracle_user = oracle_user
        self.instance = instance
        self.env = env

        wallet_path = "$SCRIPTS/oracle/wallets/{env}/{oracle_user}".format(env=self.env.upper(),oracle_user=self.oracle_user.upper())
        os.environ["TNS_ADMIN"] = os.path.expandvars(wallet_path)
        os.environ["NLS_LANG"] = "Italian_Italy.UTF8"
        self.connection = cx_Oracle.connect("/@"+self.instance.upper())

Первое соединение установлено без ошибок, но когда я пытаюсь изменить службу (т. Е. Аргумент «instance» класса Connection), соединение отклоняется.Параметры передаются в конструктор правильно, но сценарий продолжает видеть первый кошелек, который, очевидно, содержит user / pwd для другого сервиса.

Как мне преодолеть эту «постоянство»?

1 Ответ

0 голосов
/ 06 апреля 2019

Oracle считывает свои переменные окружения, включая такие, как TNS_ADMIN и NLS_LANG, только один раз. Как только соединение установлено, переменные среды больше не используются. Это, вероятно, источник той «настойчивости», которую вы видите. Вам необходимо убедиться, что все переменные среды определены до того, как будет установлено соединение, и подходят для всех соединений, которые вы намереваетесь установить; в противном случае вам нужно будет использовать какой-нибудь дочерний процесс (но не созданный с помощью fork).

...