Python SQLAlchemy:如何将作用域会话绑定到请求

Python SQLAlchemy:如何将作用域会话绑定到请求,python,session,sqlalchemy,Python,Session,Sqlalchemy,我对炼金术还不熟悉,似乎我仍然错过了几个基本概念。我想使用sqlalchemy来处理多线程web应用程序中的db交互 所以我从 import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, scoped_session engine = create_engine('mysql://mydb'

我对炼金术还不熟悉,似乎我仍然错过了几个基本概念。我想使用sqlalchemy来处理多线程web应用程序中的db交互

所以我从

import sqlalchemy
from sqlalchemy                 import create_engine
from sqlalchemy.orm             import sessionmaker, scoped_session

engine          = create_engine('mysql://mydb')
session_factory = sessionmaker( autocommit  = False,
                                autoflush   = False,
                                bind        = engine )
Session         = scoped_session(session_factory)
我使用处理请求的
moimoin
wiki,因此我有一个包含请求的对象
macro.request

比如说,我现在在某个类中有了一个方法

def do_sth():
    session = Session()
    # use the session to get some data from the db
我在何处以及如何告诉
会话
对象它链接到哪个请求

阅读,它说

默认情况下,ScopedSession对象使用[threading.local()]作为存储,以便为调用ScopedSession注册表的所有用户维护单个会话,但仅在单个线程的范围内。在不同线程中调用注册表的调用方将获得另一个线程的本地会话实例

因此,“在不同线程中调用注册表的调用方将获得另一个线程的本地会话实例。”

如果我从未告诉会话实例链接到哪个请求,那么会话实例如何是本地的

警察说

因此,我们上面的scoped_session用法示例(在多个调用中维护同一个session对象)表明,某些进程需要就位,以便跨多个线程的多个调用实际上无法获得同一会话的句柄。我们将这个概念称为线程本地存储,这意味着使用一个特殊的对象,它将为每个应用程序线程维护一个不同的对象。Python通过threading.local()构造提供了这一点

因此,尽管我还没有弄清楚如何从给定会话中获取当前线程的
pid
,但是
threading
模块用于将会话链接到线程。特别是,可以检查会话的

在问题中的示例中,测试
Session()


总之,只要每个请求都由自己的线程处理,会话就会正确地链接到请求。

感谢您提供文档链接!
session.hash_key