2015-06-05 68 views
1

文章What the Zope Transaction Manager Means To Me (and you),演示了一個很好的方式,以一個SQLAlchemy的DB會話連接到每個請求是這樣的:線程安全的SQLAlchemy會話請求

def includeme(config): 
    settings = config.get_settings() 
    engine = engine_from_config(settings) 

    maker = sessionmaker() 
    register(maker) 
    maker.configure(bind=engine) 

    config.add_request_method(lambda request: maker(), 'db_session', reify=True) 

這種方法的問題是,「事務管理器仍然作爲本地設計的線索提供「。任何想法如何解決它?謝謝!

+0

這不僅僅是交易管理,在這裏你也有會話上的線程局部約束。你看過http://docs.sqlalchemy.org/en/latest/orm/contextual.html#using-thread-local-scope-with-web-applications – sdupton

回答

3

https://gist.github.com/mmerickel/84b34ee5d68ed20dae10#file-model-py-L16-L19 感謝pyramid_tm包中的一些改進,您實際上可以完全刪除threadlocal事務管理器。這是不是一個好主意取決於你。

+0

謝謝!正是我在尋找的 –

+0

您能否詳細說一下「這是否是個好主意取決於您」有沒有什麼情況可以避免線程本地人? – canni

+0

可能有某些軟件包希望threadlocals可用,因爲它是與'transaction'包(用於協調提交的'zope.sqlalchemy','pyramid_tm'等底層包]交互的默認方法。 –