使用Postgraphile进行关系查询

时间:2019-06-24 10:45:24

标签: javascript graphql graphql-js 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"?",

2 个答案:

答案 0 :(得分:1)

您收到的错误表明您在表之间没有外键约束(即references events),请参见PostGraphile文档中的relations。您的查询也是无效的,因为它向eventByEventId字段添加了不存在的参数:eventId是隐式的,因为它已经存在于您要查询的记录中。如果您使用GraphiQL或类似的GraphQL IDE,它应该向您显示查询与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');

然后针对它运行最新的postgraphile:

$ 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
        }
      }
    }
  }
}

答案 1 :(得分:-1)

GraphQL不查询数据库,您使用的是哪种中间件?

eventByEventId必须在GraphQL解析器中定义。