在同一个控制器中有多个SQLAlchemy会话可以,或者我应该将它们全部放入一个会话中?

时间:2011-10-31 06:55:43

标签: python sqlalchemy pyramid

所以我有一个呈现页面的控制器。在控制器中,我从模型中调用多个函数来创建自己的会话。例如:

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 个答案:

答案 0 :(得分:6)

如果您的DBSessionScopedSession,那么您的第一个代码就行了。 DBSession()不是构造函数,而只是线程局部存储的访问器函数。你可以通过明确地传递会话来加速一些事情,但过早的优化是万恶之源。