Я новичок в 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(...)
Есть ли между ними разница?
Ответ 1 · рейтинг 16 · glyphobet
В приведенном выше коде нет никакой разницы. Это потому, что в строке 3 первого примера:
- свойство
query явно привязано к DBSession
- нет пользовательского объекта
Query, переданного в query_property
Как указывает @petr-viktorin в здесь, должен быть доступен сеанс, прежде чем вы определите свою модель в первом пример, который может быть проблематичным в зависимости от структуры вашего приложения.
Однако если вам нужен пользовательский запрос, который автоматически добавляет дополнительные параметры запроса ко всем запросам, то только первый пример позволит это сделать. Пользовательский класс запроса, который наследуется от sqlalchemy.orm.query.Query, может быть передан в качестве аргумента в query_property. Этот вопрос показывает пример этого шаблона.
Даже если в объекте модели определено пользовательское свойство запроса, это свойство не используется при запросе с помощью session.query, как в последней строке второго примера. Это означает, что что-то вроде первого примера является единственным вариантом, если вам нужен собственный класс запросов.
Ответ 2 · рейтинг 5 · Robert
Ответ (здесь) на другой вопрос SQLAlchemy может помочь. Этот ответ начинается с:
Вы можете использовать Model.query, потому что Model (или обычно его базовый класс, особенно в случаях, когда используется декларативное расширение) назначается Session.query_property. В этом случае Model.query эквивалентно Session.query(Model).
Ответ 3 · рейтинг 3 · Petr Viktorin
Я вижу эти недостатки в query_property а>:
- Вы не можете использовать его в сеансе, отличном от того, который вы настроили (хотя тогда вы всегда можете использовать
session.query).
- Вам нужен объект сеанса, доступный до того, как вы определите свою схему.
Они могут укусить вас, например, когда вы хотите написать тесты.
Кроме того, session.query лучше соответствует тому, как работает SQLAlchemy; query_property выглядит так, будто просто добавлен сверху для удобства (или сходства с другими системами?). Я рекомендую вам придерживаться session.query.