Выполнение реляционных запросов с помощью Postgraphile

У меня есть следующая настройка БД

Мероприятия

| event_id | event_name |
|----------|------------|
| 1        | Test       |
| 2        | World      |

награды

| award_id | event_id | award_name  |
|----------|----------|-------------|
| 1        | 1        | greatness   |
| 2        | 2        | really good |

и я пытаюсь запросить БД следующим образом:

{ 
  allAwards {
    edges {
      node {
        awardId
        eventByEventId(eventId: eventId) {
          year
          name
          country
          location
          date
          dateCreated
        }
      }
    }
  }
}

Со следующей ошибкой:

Cannot query field "eventByEventId" on type "Award". Did you mean "eventId"?",

Я обновил ваш заголовок и добавил тег postgraphile. Этот вопрос действительно касается Postgraphile, а не GraphQL в целом.

Daniel Rearden 24.06.2019 16:49

Приветствую Даниэля. Это? Вы можете эффективно использовать предложение Where в graphQL?

Jamie Hutber 24.06.2019 18:03

Сам GraphQL не зависит от нижележащего уровня хранения. Он может взаимодействовать с базой данных, как это позволяет делать Postgraphile, но он может так же легко получать данные из файловой системы или других API. Таким образом, концепции, специфичные для базы данных, в целом не применимы к GraphQL.

Daniel Rearden 24.06.2019 18:19

Как вы создали свой awards стол? Вы добавили ограничение внешнего ключа к event_id, как показано в документы?

Daniel Rearden 24.06.2019 18:26

да, так что в моей таблице наград у меня есть 3 FK, или, например, у наград есть fk на event_id. В настоящее время у меня есть только фильтрация через postgraphile-plugin-connection-filter

Jamie Hutber 24.06.2019 18:38

Приведенная вами ошибка предполагает, что ограничения внешнего ключа нет; если это действительно так, попробуйте перезапустить сервер, чтобы повторно запустить самоанализ. Ваше поле eventByEventId также не требует аргументов, поскольку EventId предоставляется в таблице наград. Вот пример (с использованием плагина упрощения инфлекторов для более красивых имен полей): graphile.org/postgraphile/examples/…

Benjie 25.06.2019 00:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
910
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

GraphQL не запрашивает базы данных, какое промежуточное ПО вы используете?

eventByEventId должен быть определен в преобразователе GraphQL.

Интересно, что я не могу запросить, postgraphile создал для меня eventByEventId. Я подумал, что, возможно, вы можете сшить их для меня с помощью graphQL. Я полагаю, мне нужно будет запросить оба и отфильтровать в приложении?

Jamie Hutber 24.06.2019 14:51
Ответ принят как подходящий

Ошибка, которую вы получаете, предполагает, что у вас нет ограничения внешнего ключа между таблицами (например, references events), см. связи в документации PostGraphile. Ваш запрос также недействителен в том смысле, что он добавляет несуществующие аргументы в поле eventByEventId: eventId является неявным, поскольку он уже существует в запрашиваемой записи. Если вы используете GraphiQL или аналогичную среду разработки GraphQL, она должна показать вам, где ваш запрос не соответствует схеме GraphQL, и даже дать вам подсказки, как это исправить.

Я воссоздал вашу схему со следующим SQL:

create table events (
  event_id serial primary key,
  event_name text
);
insert into events (event_name) values ('Test'), ('World');

create table awards (
  award_id serial primary key,
  event_id int references events, -- < THIS IS THE IMPORTANT BIT
  award_name text
);
insert into awards (event_id, award_name) values (1, 'greatness'), (2, 'really good');

А затем запустил последний постграфил против него:

$ npx postgraphile@latest -c deleteme
npx: installed 119 in 11.26s

PostGraphile v4.4.1 server listening on port 5000 ?

  ‣ GraphQL API:         http://localhost:5000/graphql
  ‣ GraphiQL GUI/IDE:    http://localhost:5000/graphiql (enhance with '--enhance-graphiql')
  ‣ Postgres connection: postgres:///deleteme
  ‣ Postgres schema(s):  public
  ‣ Documentation:       https://graphile.org/postgraphile/introduction/
  ‣ Join Jimmy McBroom in supporting PostGraphile development: https://graphile.org/sponsor/

* * *

И выдал запрос GraphQL:

{ 
  allAwards {
    edges {
      node {
        awardId
        eventByEventId {
          eventName
        }
      }
    }
  }
}

Все это работает так, как ожидалось:

GraphiQL example

PS: я бы рекомендовал вам использовать плагин @graphile-contrib/pg-simplify-inflector для автоматического упрощения имен различных отношений. С этим плагином командная строка будет такой:

postgraphile -c deleteme --append-plugins @graphile-contrib/pg-simplify-inflector

И запрос:

{ 
  awards {
    edges {
      node {
        awardId
        event {
          eventName
        }
      }
    }
  }
}

Удивительный Бенджи. Спасибо за это подробное объяснение. Я считаю, что правильно настроил свои FK и перезапустил серверы. Но с этим я могу пройти шаг за шагом и четко определить свою проблему. Но это приносит мне большую радость, зная, что мои настройки базы данных не совсем неверны.

Jamie Hutber 26.06.2019 13:27

Когда вы это поймете, дайте мне знать, так как это поможет мне направлять других пользователей в будущем ?

Benjie 26.06.2019 15:14

Прошло много времени и вот я здесь. Еще раз спасибо Бенджи. Так что действительно FK отсутствовал, и как только FK был помещен в правильное положение, все заработало, как и ожидалось! Теперь запросы тривиальны. stackoverflow.com/questions/59524125/… Это мой следующий реляционный вопрос. Если у вас есть свободное время! Еще раз спасибо

Jamie Hutber 02.01.2020 09:29

Другие вопросы по теме