Структура запроса GraphQL для фильтрации / агрегирования результатов из таблицы PostgreSQL - PullRequest
0 голосов
/ 28 октября 2019

Я новичок в GraphQL и изо всех сил пытаюсь понять, как обращаться к таблице или ссылаться на нее таким же логическим способом, как и в обычном запросе SQL. Я создал докер-контейнер для postgres и инициализировал базу данных простой таблицей данных.

Чтобы создать таблицу, я запустил ее в своем каталоге \init. (Запуск Windows между прочим)

CREATE TABLE fda.nfl (
    "team" TEXT,
    "conference" TEXT,
    "division" TEXT,
    "city" TEXT,
    "wins" INT,
    "losses" INT,
    "ties" INT
);

В GraphiQL я могу просто выбрать все с помощью этого запроса:

{
  allNfls {
    edges {
      node {
        team
        conference
        division
        city
        wins
        losses
        ties
      }
    }
  }
}

Я хочу запустить что-то, что может агрегировать по вертикали и горизонтали, например, sum(losses) as total_losses или (wins / (wins + losses + ties)) as win_ratio. Я не уверен, как поступить в любом из этих сценариев с GraphQL. Мне также необходимо выполнить запрос при определенных условиях, но передача имени столбца в качестве аргумента node, похоже, не работает, то есть node(team: "Chiefs") возвращает ошибку об типе allNfls

Ссылкатакая таблица Postgres в GraphQL вообще возможна?

1 Ответ

1 голос
/ 29 октября 2019

Мне нужно выполнить запрос при определенных условиях, но передача имени столбца в качестве аргумента node, похоже, не работает

Стандартный плагин фильтрации добавляет аргументы условия в поле allNfls, поэтому попробуйте

query {
  allNfls(condition: {team: "Chiefs"}) {
    edges {
      node {
        conference
        division
        city
      }
    }
  }
}

В качестве альтернативы, предполагая, что имя команды является первичным ключом в вашей таблице, вы также должны иметь возможность выбрать отдельную команду:

query {
  nfl(team: "Chiefs") { # maybe `nflByTeam`?
    city
    wins
    losses
    ties
  }
}

Я хочу запустить что-то, что может агрегировать по вертикали и горизонтали, например, sum(losses) as total_losses или (wins / (wins + losses + ties)) as win_ratio. Я не уверен, как поступить в любом из этих сценариев с GraphQL.

Для вертикальных агрегатов вам нужно будет использовать (нестандартный) агрегатный плагин , с которым выможет сделать что-то вроде

query {
  allNfls { # might also use a condition
    sums {
      losses
    }
  }
}

«Горизонтальный агрегат» - это пользовательский вычисляемый столбец , которого проще всего достичь, написав функцию Postgres SQL:

CREATE FUNCTION fda.nfl_win_ratio(n fda.nfl) RETURNS real
LANGUAGE SQL
IMMUTABLE
AS $$ SELECT n.wins / (n.wins + n.losses + n.ties)) $$

Для более сложных вещей, вы можете добавить свои собственные поля к любому из типов GraphQL, написав свой собственный плагин с помощью makeExtendSchemaPlugin, который может использовать всю мощь SQL и JavaScriptвместе взятые.

...