Нормально ли иметь несколько сеансов SQLAlchemy в одном контроллере, или я должен поместить их все в один сеанс? - PullRequest
3 голосов
/ 31 октября 2011

Итак, у меня есть контроллер, который отображает страницу. В контроллере я вызываю несколько функций из модели, которые создают свои собственные сеансы. Например:

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

Мой вопрос заключается в том, создает ли новый сеанс для каждой оптимальной функции, или я должен начать сеанс в контроллере и использовать один и тот же сеанс во всем контроллере (при условии, что я выполняю как запросы, так и вставку в базу данных в контроллер)? 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)...

1 Ответ

6 голосов
/ 31 октября 2011

Ваш первый код в порядке, если ваш DBSession - ScopedSession.DBSession() - это не конструктор, а функция доступа к локальному хранилищу потоков.Вы можете немного ускорить процесс, передав явную сессию, но преждевременная оптимизация - корень всего зла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...