参照している問題を示すために、いくつかの簡略化されたテストコードから始めます。
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によって行われている内部作業がいくつかあることを認識しています(私は推測します)。それが、この質問に対するAntsAasmaの回答が扱っていることだと思います。しかし、なぜそのように設定されたフィールドを引き継がないのでしょうか。そのようなものが確実に引き継がれるようにする方法はありますか?
特定の生のSQLクエリを実行できるように、セッションにバインドされたエンジンが必要ですが、スレッドをインスタンス化するとすぐに値を忘れてしまいます。
皆さんが提供できる洞察は、進行中のレッグワークをよりよく理解するのに役立ち、新しいスレッドを初期化してエンジンを設定するたびにt_model.session.bindを設定する必要をなくす方法を教えてください。