В чем разница между Model.query и session.query(Model) в SQLAlchemy?

Я новичок в SQLAlchemy, и найденный запрос можно выполнить двумя способами:

Подход 1:

DBSession = scoped_session(sessionmaker())
class _Base(object):
    query = DBSession.query_property()

Base = declarative_base(cls=_Base)

class SomeModel(Base):
    key   = Column(Unicode, primary_key=True)
    value = Column(Unicode)

# When querying
result = SomeModel.query.filter(...)

Подход 2

DBSession = scoped_session(sessionmaker())
Base = declarative_base()

class SomeModel(Base):
    key   = Column(Unicode, primary_key=True)
    value = Column(Unicode)

# When querying
session = DBSession()
result = session.query(SomeModel).filter(...)

Есть ли между ними разница?


person Cosmia Luna    schedule 10.09.2012    source источник


Ответы (3)


В приведенном выше коде нет никакой разницы. Это потому, что в строке 3 первого примера:

  • свойство query явно привязано к DBSession
  • нет пользовательского объекта Query, переданного в query_property

Как указывает @petr-viktorin в здесь, должен быть доступен сеанс, прежде чем вы определите свою модель в первом пример, который может быть проблематичным в зависимости от структуры вашего приложения.

Однако если вам нужен пользовательский запрос, который автоматически добавляет дополнительные параметры запроса ко всем запросам, то только первый пример позволит это сделать. Пользовательский класс запроса, который наследуется от sqlalchemy.orm.query.Query, может быть передан в качестве аргумента в query_property. Этот вопрос показывает пример этого шаблона.

Даже если в объекте модели определено пользовательское свойство запроса, это свойство не используется при запросе с помощью session.query, как в последней строке второго примера. Это означает, что что-то вроде первого примера является единственным вариантом, если вам нужен собственный класс запросов.

person glyphobet    schedule 28.01.2013

Ответ (здесь) на другой вопрос SQLAlchemy может помочь. Этот ответ начинается с:

Вы можете использовать Model.query, потому что Model (или обычно его базовый класс, особенно в случаях, когда используется декларативное расширение) назначается Session.query_property. В этом случае Model.query эквивалентно Session.query(Model).

person Robert    schedule 09.09.2015