Подтвердить что ты не робот

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

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

Подход 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(...)

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Я вижу эти недостатки query_propety:

  • Вы не можете использовать его на другом сеансе, чем тот, который вы настроили (хотя всегда можно использовать session.query).
  • Перед определением схемы вам нужен объект сеанса.

Это может укусить вас, если вы хотите, например, написать тесты.

Кроме того, session.query лучше подходит для работы SQLAlchemy; query_property выглядит просто добавленным сверху для удобства (или сходства с другими системами?). Я рекомендую вам придерживаться session.query.

Ответ 3

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

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