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

发布于 2024-12-13 03:33:16 字数 1095 浏览 0 评论 0原文

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

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)...

So I have a controller that renders a page. In the controller, I call multiple functions from the model that create its own sessions. For example:

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

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

Where in the model I have:

class User:
    ...

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

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

My question is, is creating a new session for each function optimal, or should I start a session in the controller and use the same session throughout the controller (assuming I'm both querying as well as inserting into the database in the controller)? Ex.

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)...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我只土不豪 2024-12-20 03:33:16

如果您的 DBSessionScopedSession,您的第一个代码就可以。那么,DBSession() 就不是构造函数,而只是线程本地存储的访问函数。您可以通过显式传递会话来加快速度,但过早的优化是万恶之源。

Your first code is OK, if your DBSession is a ScopedSession. DBSession() is not a constructor then, but just an accessor function to thread-local storage. You might speed up things a bit by passing the session explicitly, but premature optimization is the root of all evil.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文