在同一控制器中使用多个SQLAlchemy会话可以吗,还是应该合并为一个会话?
我有一个控制器,它负责渲染一个页面。在这个控制器里,我调用了多个来自模型的函数,而这些函数各自会创建自己的会话。比如:
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()
其实不是一个构造函数,而只是一个用来访问线程本地存储的函数。你可以通过明确传递会话来稍微加快速度,但过早的优化往往会带来麻烦。