【问题标题】:Pyramid with SQLAlchemy: scoped or non-scoped database session带有 SQLAlchemy 的金字塔:作用域或非作用域数据库会话
【发布时间】:2016-12-07 00:58:39
【问题描述】:

对于旧版本的金字塔,sqlalchemy 会话的设置是使用与此类似的 scooped_session 完成的

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

但是我看到更新的教程以及金字塔 docs 'promotes' sqlalchemy 没有将 DBSession 附加到请求对象的线程本地化。

“旧”方式被破坏了吗?没有线程本地化的优势是什么?

【问题讨论】:

    标签: python sqlalchemy pyramid


    【解决方案1】:

    在其他几位贡献者的帮助下,我率先实现了这一转变,他们曾在博客 [1] 中介绍了一些优势。它基本上归结为遵循金字塔哲学,使编写不需要任何全局变量的应用程序成为可能。这在编写可重用、可组合的代码时非常重要。它使您的代码的依赖关系(api 表面)清晰,而不是让随机函数依赖于您的数据库,尽管它们的函数签名/成员变量没有暴露这些依赖关系。这也使测试代码更容易,因为您不必担心线程局部变量。使用全局变量,您需要跟踪哪些模块可能持有对它们的引用并修补它们以使用新对象。如果没有全局变量,您只需传入要使用的对象,代码就会使用它们,就像函数或对象状态的任何其他参数一样。

    很多人抱怨必须将他们的数据库传递给大量函数。这是一种气味,仅表示您没有很好地设计您的 api。很多时候,您可以将事物构造为每个请求创建一次的对象,并将句柄存储为 self.dbsession 之类的东西,现在对象上的每个方法都可以访问它。

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

    【讨论】:

    • 这篇博文引起了这个问题,有道理 - 谢谢
    • 链接的博客文章正在为我返回 HTTP 502。
    猜你喜欢
    • 2013-02-27
    • 2017-12-21
    • 2013-11-23
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    相关资源
    最近更新 更多