2011-08-09 20 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

沒問題。其實,我不確定這是如何在內部工作的。下面是我的舊代碼中的實際評論:'#不要做model.Session.bind =引擎,不知何故它不會粘住' – sayap

相關問題