用于过滤/聚合来自 PostgreSQL 的结果的 GraphQL 查询结构 Table
GraphQL Query Structure to Filter / Aggregate Results from a PostgreSQL Table
我是 GraphQL 的新手,我正在努力理解如何以与处理普通 SQL 查询相同的逻辑方式访问/引用 table。我为 postgres 创建了一个 docker 容器,并用简单的 table 数据初始化了数据库。
为了创建 table,我 运行 在我的 \init
目录中。 (运行 Windows 顺便说一句)
CREATE TABLE fda.nfl (
"team" TEXT,
"conference" TEXT,
"division" TEXT,
"city" TEXT,
"wins" INT,
"losses" INT,
"ties" INT
);
在 GraphiQL 中,我可以简单地 select 使用此查询的所有内容:
{
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
[= 的错误19=]
是否可以在 GraphQL 中像这样引用 Postgres table?
I would need to query on certain conditions, but passing in a column name as an argument to node
does not seem to work
标准 filtering plugin 将条件参数添加到 allNfls
字段,因此请尝试
query {
allNfls(condition: {team: "Chiefs"}) {
edges {
node {
conference
division
city
}
}
}
}
或者,假设团队名称是您 table 中的主键,您也应该能够 select 个人团队:
query {
nfl(team: "Chiefs") { # maybe `nflByTeam`?
city
wins
losses
ties
}
}
I want to run something that can aggregate vertically and horizontally, e.g. sum(losses) as total_losses
or (wins / (wins + losses + ties)) as win_ratio
. I am unsure how to go about either of those scenarios with GraphQL.
对于垂直聚合,您需要使用(非标准)aggregates plugin,您可以使用它来执行类似
的操作
query {
allNfls { # might also use a condition
sums {
losses
}
}
}
"horizontal aggregate" 是自定义的 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 组合的全部功能.
我是 GraphQL 的新手,我正在努力理解如何以与处理普通 SQL 查询相同的逻辑方式访问/引用 table。我为 postgres 创建了一个 docker 容器,并用简单的 table 数据初始化了数据库。
为了创建 table,我 运行 在我的 \init
目录中。 (运行 Windows 顺便说一句)
CREATE TABLE fda.nfl (
"team" TEXT,
"conference" TEXT,
"division" TEXT,
"city" TEXT,
"wins" INT,
"losses" INT,
"ties" INT
);
在 GraphiQL 中,我可以简单地 select 使用此查询的所有内容:
{
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
[= 的错误19=]
是否可以在 GraphQL 中像这样引用 Postgres table?
I would need to query on certain conditions, but passing in a column name as an argument to
node
does not seem to work
标准 filtering plugin 将条件参数添加到 allNfls
字段,因此请尝试
query {
allNfls(condition: {team: "Chiefs"}) {
edges {
node {
conference
division
city
}
}
}
}
或者,假设团队名称是您 table 中的主键,您也应该能够 select 个人团队:
query {
nfl(team: "Chiefs") { # maybe `nflByTeam`?
city
wins
losses
ties
}
}
I want to run something that can aggregate vertically and horizontally, e.g.
sum(losses) as total_losses
or(wins / (wins + losses + ties)) as win_ratio
. I am unsure how to go about either of those scenarios with GraphQL.
对于垂直聚合,您需要使用(非标准)aggregates plugin,您可以使用它来执行类似
的操作query {
allNfls { # might also use a condition
sums {
losses
}
}
}
"horizontal aggregate" 是自定义的 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 组合的全部功能.