【问题标题】:GraphQL Query Structure to Filter / Aggregate Results from a PostgreSQL Table用于从 PostgreSQL 表中过滤/聚合结果的 GraphQL 查询结构
【发布时间】:2020-02-23 18:45:47
【问题描述】:

我是 GraphQL 的新手,我正在努力理解如何以与处理普通 SQL 查询相同的逻辑方式访问/引用表。我为 postgres 创建了一个 docker 容器,并使用一个简单的数据表初始化了数据库。

为了创建表,我在\init 目录中运行了它。 (顺便说一句,运行 Windows)

CREATE TABLE fda.nfl (
    "team" TEXT,
    "conference" TEXT,
    "division" TEXT,
    "city" TEXT,
    "wins" INT,
    "losses" INT,
    "ties" INT
);

在 GraphiQL 中,我可以使用这个查询简单地选择所有内容:

{
  allNfls {
    edges {
      node {
        team
        conference
        division
        city
        wins
        losses
        ties
      }
    }
  }
}

我想运行一些可以垂直和水平聚合的东西,例如sum(losses) as total_losses(wins / (wins + losses + ties)) as win_ratio。我不确定如何使用 GraphQL 处理这两种情况。我还需要查询某些条件,但是将列名作为参数传递给node 似乎不起作用,即node(team: "Chiefs") 吐出关于allNfls 类型的错误

是否可以在 GraphQL 中引用这样的 Postgres 表?

【问题讨论】:

  • 不是直接的;他们的数据模型相当不同。您可能会看到 Prisma 提供的内容。将 GraphQL 视为在 REST API 中选择字段和跟踪链接可能会好一点,而不是像 SQL 这样的查询语言:唯一的“连接”或“计算”选项是模式作者选择公开的东西.

标签: postgresql graphql postgraphile


【解决方案1】:

我需要在某些条件下进行查询,但是将列名作为参数传递给 node 似乎不起作用

标准的filtering plugin 将条件参数添加到allNfls 字段,所以试试

query {
  allNfls(condition: {team: "Chiefs"}) {
    edges {
      node {
        conference
        division
        city
      }
    }
  }
}

或者,假设团队名称是表中的主键,您还应该能够选择单个团队:

query {
  nfl(team: "Chiefs") { # maybe `nflByTeam`?
    city
    wins
    losses
    ties
  }
}

我想运行一些可以垂直和水平聚合的东西,例如sum(losses) as total_losses(wins / (wins + losses + ties)) as win_ratio。我不确定如何使用 GraphQL 处理这两种情况。

对于垂直聚合,您需要使用(非标准)aggregates plugin,您可以使用它来执行类似的操作

query {
  allNfls { # might also use a condition
    sums {
      losses
    }
  }
}

“水平聚合”是自定义的computed column,您可以通过编写 Postgres SQL 函数最轻松地实现:

CREATE FUNCTION fda.nfl_win_ratio(n fda.nfl) RETURNS real
LANGUAGE SQL
IMMUTABLE
AS $$ SELECT n.wins / (n.wins + n.losses + n.ties)) $$

对于更复杂的内容,您可能希望通过 writing your own plugin with the help of makeExtendSchemaPlugin 将自己的字段添加到任何 GraphQL 类型,这可以结合使用 SQL 和 JavaScript 的全部功能。

【讨论】:

    猜你喜欢
    • 2019-12-29
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 2014-10-22
    相关资源
    最近更新 更多