我是GraphQL的新手,我正努力了解如何以与处理普通SQL查询相同的逻辑方式访问/引用表。我为postgres创建了一个docker容器,并用一个简单的数据表初始化了数据库。
要创建表,我在\init
目录中运行了该表。 (正在运行Windows btw)
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表?
答案 0 :(得分: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的强大功能。