2015-06-05 70 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'等底层包]交互的默认方法。 –