Как установить текущую схему (session set current_schema) глобально?

Изменяю текущую схему в функции:

db_dwh.cursor.execute("alter session set current_schema = SCHEMA_NAME")

Но когда с объектом db_dwh пытаюсь выполнить запрос к таблице, то получаю ошибку:

ORA-00942: table or view does not exist

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

Есть ли способ глобально установить текущую схему только один раз?


Свободный перевод вопроса cx_oracle alter schema not working globally от участника @Abhishek Kumar


Ответы (1 шт):

Автор решения: 0xdb

По всей видимости, запрос выполняется с другим соединением. Похоже, используется пул соединений.

Вот некоторые доступные способы. Они могут быть полезны в зависимости от архитектуры приложения:

  • Connection.current_schema вместо явного ALTER SESSION. Это сэкономит временные затраты на выполнение execute().

  • Connection Pool callbacks для эффективной установки состояния соединения. Если речь о установке текушей схемы глобально, то есть она всегда будет иметь одно и то же значение, то это решение в сочетании с атрибутом Connection.current_schema самое подходящее.

Пример для реализации:

def init_session(connection, requested_tag):
    connection.current_schema = 'ME'

pool = cx_Oracle.SessionPool (user='user', password='pass', dsn='dbsrv/pdb1', 
                              min=2, max=5, increment=1, encoding="UTF-8", 
                              sessionCallback=init_session)
        
connection = pool.acquire (tag='schema=me')

cursor = connection.cursor() 
cursor.execute("""select sys_context('USERENV', 'current_schema') from dual""")
print (cursor.fetchone()) # ('ME',)

pool.release(connection)

Свободный перевод ответа от участника @Christopher Jones

→ Ссылка