首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Postgraphile进行关系查询

使用Postgraphile进行关系查询
EN

Stack Overflow用户
提问于 2019-06-24 18:45:24
回答 2查看 828关注 0票数 0

我有以下的db设置

事件

代码语言:javascript
复制
| event_id | event_name |
|----------|------------|
| 1        | Test       |
| 2        | World      |

奖项

代码语言:javascript
复制
| award_id | event_id | award_name  |
|----------|----------|-------------|
| 1        | 1        | greatness   |
| 2        | 2        | really good |

我正在尝试查询数据库,如下所示:

代码语言:javascript
复制
{ 
  allAwards {
    edges {
      node {
        awardId
        eventByEventId(eventId: eventId) {
          year
          name
          country
          location
          date
          dateCreated
        }
      }
    }
  }
}

出现以下错误:

代码语言:javascript
复制
Cannot query field "eventByEventId" on type "Award". Did you mean "eventId"?",
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-26 15:56:46

您收到的错误提示您在表之间没有外键约束(即references events),请参阅PostGraphile文档中的relations。您的查询也是无效的,因为它向eventByEventId字段添加了不存在的参数:eventId是隐式的,因为它已经存在于您要查询的记录中。如果您使用GraphiQL或类似的GraphQL集成开发环境,它应该会向您显示查询与GraphQL模式不匹配的地方,甚至会提示您如何修复它。

我已经使用以下SQL重新创建了您的模式:

代码语言:javascript
复制
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:

代码语言:javascript
复制
$ 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查询:

代码语言:javascript
复制
{ 
  allAwards {
    edges {
      node {
        awardId
        eventByEventId {
          eventName
        }
      }
    }
  }
}

这一切都如预期的那样工作:

PS:我建议你使用@graphile-contrib/pg-simplify-inflector插件来自动简化各种关系的名称。使用此插件,命令行将为:

代码语言:javascript
复制
postgraphile -c deleteme --append-plugins @graphile-contrib/pg-simplify-inflector

和查询:

代码语言:javascript
复制
{ 
  awards {
    edges {
      node {
        awardId
        event {
          eventName
        }
      }
    }
  }
}
票数 2
EN

Stack Overflow用户

发布于 2019-06-24 20:49:01

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

必须在GraphQL解析程序中定义eventByEventId

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56734931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档