Почему для session.bind в Elixir / SQLAlchemy в потоках задано значение None? - PullRequest
1 голос
/ 10 августа 2011

Я начну с некоторого упрощенного тестового кода, чтобы продемонстрировать проблему, на которую я ссылаюсь.

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 Ответ

1 голос
/ 10 августа 2011

Попробуйте заменить это:

session.bind = metadata.bind

с:

session.configure(bind=metadata.bind)
...