У меня есть следующая настройка БД
| 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"?",
Приветствую Даниэля. Это? Вы можете эффективно использовать предложение Where в graphQL?
Сам GraphQL не зависит от нижележащего уровня хранения. Он может взаимодействовать с базой данных, как это позволяет делать Postgraphile, но он может так же легко получать данные из файловой системы или других API. Таким образом, концепции, специфичные для базы данных, в целом не применимы к GraphQL.
Как вы создали свой awards стол? Вы добавили ограничение внешнего ключа к event_id, как показано в документы?
да, так что в моей таблице наград у меня есть 3 FK, или, например, у наград есть fk на event_id. В настоящее время у меня есть только фильтрация через postgraphile-plugin-connection-filter
Приведенная вами ошибка предполагает, что ограничения внешнего ключа нет; если это действительно так, попробуйте перезапустить сервер, чтобы повторно запустить самоанализ. Ваше поле eventByEventId также не требует аргументов, поскольку EventId предоставляется в таблице наград. Вот пример (с использованием плагина упрощения инфлекторов для более красивых имен полей): graphile.org/postgraphile/examples/…



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


GraphQL не запрашивает базы данных, какое промежуточное ПО вы используете?
eventByEventId должен быть определен в преобразователе GraphQL.
Интересно, что я не могу запросить, postgraphile создал для меня eventByEventId. Я подумал, что, возможно, вы можете сшить их для меня с помощью graphQL. Я полагаю, мне нужно будет запросить оба и отфильтровать в приложении?
Ошибка, которую вы получаете, предполагает, что у вас нет ограничения внешнего ключа между таблицами (например, 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
}
}
}
}
}
Все это работает так, как ожидалось:
PS: я бы рекомендовал вам использовать плагин @graphile-contrib/pg-simplify-inflector для автоматического упрощения имен различных отношений. С этим плагином командная строка будет такой:
postgraphile -c deleteme --append-plugins @graphile-contrib/pg-simplify-inflector
И запрос:
{
awards {
edges {
node {
awardId
event {
eventName
}
}
}
}
}
Удивительный Бенджи. Спасибо за это подробное объяснение. Я считаю, что правильно настроил свои FK и перезапустил серверы. Но с этим я могу пройти шаг за шагом и четко определить свою проблему. Но это приносит мне большую радость, зная, что мои настройки базы данных не совсем неверны.
Когда вы это поймете, дайте мне знать, так как это поможет мне направлять других пользователей в будущем ?
Прошло много времени и вот я здесь. Еще раз спасибо Бенджи. Так что действительно FK отсутствовал, и как только FK был помещен в правильное положение, все заработало, как и ожидалось! Теперь запросы тривиальны. stackoverflow.com/questions/59524125/… Это мой следующий реляционный вопрос. Если у вас есть свободное время! Еще раз спасибо
Я обновил ваш заголовок и добавил тег
postgraphile. Этот вопрос действительно касается Postgraphile, а не GraphQL в целом.