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?
*捂臉*謝謝sayap! – Reno
沒問題。其實,我不確定這是如何在內部工作的。下面是我的舊代碼中的實際評論:'#不要做model.Session.bind =引擎,不知何故它不會粘住' – sayap