참조 할 문제를 보여주기 위해 간단한 테스트 코드로 시작하겠습니다.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를 설정하지 않아도됩니다.
* 마른 세수 * 당신이 년 Sayap 감사합니다! – Reno
문제 없습니다. 사실, 이것이 어떻게 내부적으로 작동하는지 확신 할 수 없습니다. 예전 코드에서 실제 주석이 있습니다 :'# do not do model.Session.bind = engine, somehow does not stick' – sayap