2011-08-09 4 views
1

참조 할 문제를 보여주기 위해 간단한 테스트 코드로 시작하겠습니다.Elixir/SQLAlchemy의 session.bind가 스레드 내에서 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에 의해 스레드에 대한 새로운 세션을 인스턴스화합니다 (필자는 짐작합니다). 나는 그것이 개미 Aasma의 this question 주소에 대한 반응이라고 생각합니다. 그러나, 왜 그렇게 설정된 필드를 가지고 있지 않습니까? 그 같은 것을 지키는 방법이 있습니까?

원시 SQL 쿼리를 만들 수 있도록 세션에 바인딩 된 엔진이 필요하지만 스레드를 인스턴스화하는 즉시 값을 잊어 버립니다.

내가 할 수있는 모든 통찰력은 다리 작업의 진행 상황을 이해하는 데 도움이되며, 새 스레드를 초기화하고 엔진을 설정할 때마다 t_model.session.bind를 설정하지 않아도됩니다.

답변

1

이 교체 시도 :와

session.bind = metadata.bind 

:

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

* 마른 세수 * 당신이 년 Sayap 감사합니다! – Reno

+0

문제 없습니다. 사실, 이것이 어떻게 내부적으로 작동하는지 확신 할 수 없습니다. 예전 코드에서 실제 주석이 있습니다 :'# do not do model.Session.bind = engine, somehow does not stick' – sayap