db.load_only не фильтрует поля - PullRequest
0 голосов
/ 17 марта 2020

Предположим, у нас есть простой запрос graphql:

 query EventQuery {
    event(id: 1) {
      id
      name
      description
  }
}

И наш метод разрешения выглядит примерно так:

    def resolve_event(self, info, id):
        event = (Event.get_query(info).filter_by(id=id).options(db.load_only('id', 'name'))).first()
        return event

или

    def resolve_event(self, info, id):
        event = db.session.query(EventModel).filter_by(id=id).options(db.load_only('id', 'name')).first()
        return event

В обоих распознаватель случаев вернет id, имя и описание, db.load_only вообще не работает. Что я делаю не так?

1 Ответ

0 голосов
/ 18 марта 2020

Из документации load_only:

Укажите, что для конкретной сущности должен быть загружен только заданный список имен атрибутов на основе столбцов; все остальные будут отложены.

Здесь «отложено» означает, что оставшиеся столбцы будут загружаться с отложенной загрузкой; так что в вашем случае, если кто-нибудь когда-либо позвонит event.description, в это время будет отправлен отдельный запрос SQL для загрузки столбца описания из базы данных.

Правильное решение действительно зависит от того, что вы работа на следующем уровне: если вы хотите, чтобы ваши запросы GraphQL возвращали сущности SQLAlchemy, которые вы можете использовать в python, то текущее поведение, вероятно, именно то, что вы хотите - просто не обращайтесь к event.description в своем коде. Если вместо этого вы создаете API, который возвращает JSON или аналогичный, то уровню сериализации также необходимо указать, какие столбцы извлечь из сущности event.

...