对于旧版本的 Pyramid ,sqlalchemy session 的设置是使用类似于此的 scooped_session 完成的
DBSession = scoped_session(
sessionmaker(
autoflush=True,
expire_on_commit=False,
extension=zope.sqlalchemy.ZopeTransactionExtension()
)
但是,我看到较新的教程以及 Pyramid docs 'promotes' sqlalchemy,其中没有将 DBSession 附加到请求对象的线程局部变量。
“旧”方式是否已被打破,没有 threadlocals 的优势是什么?
最佳答案
我在其他几位贡献者的帮助下率先进行了这种转变,他们在博客 [1] 中介绍了一些优势。它基本上归结为遵循 Pyramid 哲学,使编写不需要任何全局变量的应用程序成为可能。这在编写可重用、可组合的代码时非常重要。它使您的代码的依赖项(api 表面)变得清晰,而不是让随机函数依赖于您的数据库,尽管它们的函数签名/成员变量没有暴露这些依赖项。这也使测试代码更容易,因为您不必担心线程局部变量。使用全局变量,您需要追踪哪些模块可能持有对它们的引用并修补它们以使用新对象。如果没有全局变量,您只需传入您想要使用的对象,代码就会使用它们,就像任何其他参数传递给函数或对象上的状态一样。
很多人提示必须将他们的数据库传递给大量函数。这是一种气味,只是意味着你没有很好地设计你的 api。很多时候,您可以将事物构造为每个请求创建一次的对象,并将句柄存储为 self.dbsession
之类的内容,并且对象上的每个方法现在都可以访问它。
[1] https://metaclassical.com/testing-pyramid-apps-without-a-scoped-session/
关于python - 带有 SQLAlchemy 的 Pyramid : scoped or non-scoped database session,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40922933/