В настоящее время у меня есть сеанс, где я выполняю необработанную строку 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 является сеансом базы данных.