在同一控制器中使用多个SQLAlchemy会话可以吗,还是应该合并为一个会话?

3 投票
1 回答
2212 浏览
提问于 2025-04-17 05:19

我有一个控制器,它负责渲染一个页面。在这个控制器里,我调用了多个来自模型的函数,而这些函数各自会创建自己的会话。比如:

def page(request):
    userid = authenticated_userid(request)
    user = User.get_by_id(userid)
    things = User.get_things()

    return {'user': user, 'things': things}

在模型里,我有:

class User:
    ...

    def get_by_id(self, userid):
        return DBSession.query(User)...

    def get_things(self):
        return DBSession.query(Thing)...

我的问题是,为每个函数创建一个新的会话是否是最优的做法,还是应该在控制器里先启动一个会话,然后在整个控制器中使用同一个会话(假设我在控制器里既要查询数据库,也要插入数据)?例如:

def page(request):
    session = DBSession()
    userid = authenticated_userid(request)
    user = User.get_by_id(userid, session)
    things = User.get_things(session)
    ...
    return {'user': user, 'things': things}

class User:
    ...

    def get_by_id(self, userid, session=None):
        if not session:
            session = DBSession()
        return session.query(User)...

    def get_things(self, session=None):
        if not session:
            session = DBSession()
        return session.query(Thing)...

1 个回答

6

你的第一段代码没问题,如果你的 DBSession 是一个 ScopedSession 的话。这里的 DBSession() 其实不是一个构造函数,而只是一个用来访问线程本地存储的函数。你可以通过明确传递会话来稍微加快速度,但过早的优化往往会带来麻烦。

撰写回答