Есть ли хороший способ обработки временных таблиц в SQL -алхимии? - PullRequest
0 голосов
/ 28 января 2020

В настоящее время у меня есть сеанс, где я выполняю необработанную строку SQL (с session.execute), которая создает временную таблицу.

Temp-таблица создается следующим образом:

engine = create_engine(URI)
sessionfactory = sessionmaker(bind=engine)
session = sessionfactory()
session.execute(f"""
SELECT *
INTO #temp-table
FROM [database].[table]
""")

Мой движок (как создано выше) в настоящее время используется в 5 различных потоках, где каждый поток извлекает сеанс из фабрики сеансов, которая связан с двигателем. Это не проблема, так как сам двигатель является потокобезопасным. И сеансы по умолчанию с пулом очередей, который может обрабатывать несколько потоков.

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

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

Более того, они даже не должны создаваться одновременно в двух разных потоках, чтобы привести к этой ошибке. Если сеанс сначала используется для создания временной таблицы, а затем закрывается, а затем используется для создания другой временной таблицы, он все равно запоминает предыдущую временную таблицу. Итак, даже если sql -сессия закончена, сеанс базы данных остается открытым?

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

Любая помощь очень ценится.

Мое текущее исправление: я вручную уничтожаю любые созданные временные таблицы. Но я бы предпочел убедиться, что каждый сеанс sqlalchemy является сеансом базы данных.

...