Я начну с некоторого упрощенного тестового кода, чтобы продемонстрировать проблему, на которую я ссылаюсь.
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 каждый раз, когда я инициализирую новый поток и устанавливаю движок?