Почему для session.bind в Elixir/SQLAlchemy в потоках задано значение None?
Я начну с некоторого упрощенного тестового кода, чтобы продемонстрировать проблему, на которую я ссылаюсь.
t_model.py
from elixir import *
metadata.bind = 'sqlite:///test.db'
session.bind = metadata.bind
t_main.py
#!/usr/bin/python
import t_model
import threading
class TestThread(threading.Thread):
def run(self):
print 'Thread ID: %s, t_model.session.bind = %s' % (threading.current_thread(), t_model.session.bind)
class Test(object):
def run(self):
print 'Thread ID: %s, t_model.session.bind = %s' % (threading.current_thread(), t_model.session.bind)
if __name__ == "__main__":
Test().run()
TestThread().run()
TestThread().start()
Вывод t_main.py:
Thread ID: <_MainThread(MainThread, started 140111907010336)>, t_model.session.bind = Engine(sqlite:///test.db)
Thread ID: <_MainThread(MainThread, started 140111907010336)>, t_model.session.bind = Engine(sqlite:///test.db)
Thread ID: <TestThread(Thread-2, started 140111865108224)>, t_model.session.bind = None
Я понимаю, что Elixir/SQLAlc выполняет некоторую скрытую работу по созданию новых сеансов для потоков (я полагаю). Я полагаю, что именно на это отвечает ответ Антса Аасма на этот вопрос. Однако почему он не переносит поля, установленные таким образом? Есть ли способ обеспечить что-то подобное?
Мне нужен механизм, привязанный к сеансу, чтобы я мог выполнять некоторые необработанные запросы sql, но как только я создаю экземпляр потока, он забывает значение.
Любое понимание, которое вы, ребята, можете предоставить, чтобы помочь мне лучше понять происходящее и как мне избежать необходимости устанавливать t_model.session.bind каждый раз, когда я инициализирую новый поток и устанавливаю движок?
1 ответ
Попробуйте заменить это:
session.bind = metadata.bind
с:
session.configure(bind=metadata.bind)