Contextual/Thread-local Sessions
上下文、线程本地会话
回想一下我们在什么时候创建一个会话, 什么时候提交它, 什么时候关闭它? 引入了“”“会话范围” 的概念, 重点是web 应用程序将会和web请求相链接的实践。 大多数现代web 框架都包含集成工具, 因此可以自动管理会话的范围, 并且在可用的时候使用这些工具。
sqlalchemy 包含自己的助手对象, 这有助于建立用户自定义的会话范围。他还被第三方集成系统用于帮助构建他们的集成方案。
对象是scoedsession 对象, 它代表的会话对象的注册表。 如果你对注册别的模式不熟悉, 那么可以在企业架构的模式里面找到一个很好的解释。
注意:
scoped_session 对象是许多sqlalchemy 应用程序使用的非常流行和有用的对象。 然而, 中药的是要注意, 它只是提供了一种处理会话管理问题的方法。 如果你是sqlalchemy的新手, 特别是如果术语 “”“线程局部变量”, 在你看起来很奇怪, 那么我们建议你首先熟悉一个现成的集成框架系统, 例如 Flash-Sqlalchemy 或者zope.sqlalchemy
一个scopedsession 是通过调用它来构造的, 它传递一个可以创建新的会话对象的工厂。工厂只是在被调用时产生新对象的东西, 在会话的情况下, 最长见的工厂是在北街前面介绍的sessionmaker.,下面来说明这个用法:
>>> from sqlalchemy.orm import scoped_session
>>> from sqlalchemy.orm import sessionmaker
>>> session_factory = sessionmaker(bind=some_engine)
>>> Session = scoped_session(session_factory)
我们创建的scoped_session 对象将在我们 “”“调用” 登记处时候调用sessionmaker
>>> some_session = Session()
在上面, 有些会话是会话的实例, 我们现在可以使用他来与数据库对话。 同样的会话也会存在于我们创建的scoped_session 注册表中, 如果我们第二次访问注册表, 我们会回到同一个会话;
>>> some_other_session = Session()
>>> some_session is some_other_session
True
这种模式 允许应用程序的不同部分调用全局的scoped_session, 这样所有的这些区域可以共享同一个会话, 而不是显示的进行传递, 我们在注册表中建立的会话会保留, 直到我们明确的告诉注册中心处理它,通过调用scoped_session.remov