对于旧版金字塔,sqlalchemy会话的设置是使用与此类似的scooped_session完成的
DBSession = scoped_session(
sessionmaker(
autoflush=True,
expire_on_commit=False,
extension=zope.sqlalchemy.ZopeTransactionExtension()
)
但是我看到更新的教程以及金字塔docs'促进' sqlalchemy没有threadlocals,其中DBSession附加到请求对象。
'岁以前'方式破碎了,没有threadlocals的优势是什么?
答案 0 :(得分:8)
我在其他几位撰写博客[1]的贡献者的帮助下率先实现了这一转变。它基本上归结为遵循金字塔哲学,即可以编写不需要任何全局变量的应用程序。在编写可重用的可组合代码时,这非常重要。它使代码的依赖关系(api表面)清晰,而不是依赖于数据库的随机函数,尽管它们的函数签名/成员变量不会暴露这些依赖关系。这也使测试代码变得更容易,因为您不必担心threadlocal变量。对于全局变量,您需要跟踪哪些模块可能包含对它们的引用,并修补它们以使用新对象。如果没有全局变量,您只需传入要使用的对象,代码就会使用它们,就像对象上的函数或状态的任何其他参数一样。
很多人抱怨不得不将他们的数据库传递给大量的功能。这是一种气味,只是意味着你没有很好地设计你的api。很多时候,您可以将事物构造为每个请求创建一次的对象,并将句柄存储为类似self.dbsession
的对象,并且对象上的每个方法现在都可以访问它。
[1] https://metaclassical.com/testing-pyramid-apps-without-a-scoped-session/