带有Sqlalchemy的金字塔:范围或非划分数据库会话



对于旧版本的金字塔,Sqlalchemy会话的设置是使用类似于此

的scooped_session完成的
DBSession = scoped_session(
    sessionmaker(
        autoflush=True,
        expire_on_commit=False,
        extension=zope.sqlalchemy.ZopeTransactionExtension()
    )

但是,我看到了较新的教程以及金字塔文档的"促销" sqlalchemy,而没有将dbsession附加到请求对象的dbsession。

"旧的"方式是否破坏了,没有线路界的优势是什么?

我在其他几位贡献者的帮助下率先进行了这一过渡,这些贡献者在博客上[1]就某些优点进行了过渡。这基本上归结为遵循金字塔哲学,即编写不需要任何全球变量的应用程序。这在编写可重复使用的可重复使用代码时确实很重要。它使您的代码依赖关系(API表面)变得清晰,而不是随机函数取决于您的数据库,尽管它们的功能签名/成员变量未公开这些依赖关系。这也使测试代码更容易,因为您不必担心螺纹局部变量。使用Globals,您需要跟踪哪些模块可能会持有对它们的参考并修补它们以使用新对象。没有Globals,您只需传递要使用的对象,并且代码使用它们,就像其他参数一样,将其转换为对象上的函数或状态。

很多人抱怨必须将其数据库传递给许多功能。这是一种气味,只是意味着您无法很好地设计API。很多时候,您可以将事物构造为一次每次要求创建的对象,并将句柄存储为诸如self.dbsession之类的东西,并且该对象上的每种方法现在都可以访问它。

[1] https://metaclassical.com/testing-pyramid-apps-without-a-scoped-session/

最新更新