Создание реляционных запросов с Postgraphile - PullRequest
0 голосов
/ 24 июня 2019

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

События

| 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"?",

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Получаемая ошибка говорит о том, что между таблицами нет ограничения по внешнему ключу (т. Е. references events), см. отношения в документации PostGraphile.Ваш запрос также недопустим, так как он добавляет аргументы, которые не существуют, в поле eventByEventId: eventId неявно, так как он уже существует в записи, которую вы запрашиваете.Если вы используете GraphiQL или аналогичную среду IDE 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-simpify-inflector для автоматического упрощенияназвания различных отношений.При использовании этого плагина командная строка будет выглядеть так:

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

И запрос:

{ 
  awards {
    edges {
      node {
        awardId
        event {
          eventName
        }
      }
    }
  }
}
0 голосов
/ 24 июня 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...