GraphQL - 无法更新 table 行
GraphQL - Cannot update a table row
假设我有一个 table 具有属性 id
和 name
的人。 GraphQL 服务器全部由 Postgraphile
设置并工作,因为我可以查询和创建新条目。但是,我无法更新它。翻来覆去摸不着头脑,还是找不到原因。
这是我尝试过但时不时失败的突变。
mutation($id: Int!, $patch: PersonPatch!) {
updatePersonById(input: { id: $id, patch: $patch }) {
clientMutationId
}
}
变量
{
id: 1,
patch: {"name": "newname"}
}
我正在使用Altair GraphQL client
提交变异请求,返回的错误信息是"No values were updated in collection 'people' because no values were found."
id = 1
的人确实存在,通过向 personById
发送查询以获取他的名字来确认。但我无法更新他的名字。
编辑#1
下面是Altair GraphQL Client
生成的gql
updatePersonById(
input: UpdatePersonByIdInput!
): UpdatePersonPayload
input UpdatePersonByIdInput {
clientMutationId: String
patch: PersonPatch!
id: Int!
}
input PersonPatch {
id: Int
name: String
}
假设您正在使用行级安全性 (RLS),这听起来像是要更新的行没有通过当前经过身份验证的用户所需的安全策略。
这是一个小例子;您需要对其进行调整以适合您自己的权限系统
create table person (id serial primary key, name text);
alter table person enable row level security;
grant select, insert(name), update(name), delete on person to graphql;
create policy select_all on person for select using (true);
create policy insert_all on person for insert with check(true);
create policy update_self on person for update using (id = current_person_id());
create policy delete_self on person for delete using (id = current_person_id());
哪里
create function current_person_id() returns int as $$
select nullif(current_setting('jwt.claims.person_id', true), '')::int;
$$ language sql stable;
如果您需要更多指导,请随时进入 the Graphile chat。
假设我有一个 table 具有属性 id
和 name
的人。 GraphQL 服务器全部由 Postgraphile
设置并工作,因为我可以查询和创建新条目。但是,我无法更新它。翻来覆去摸不着头脑,还是找不到原因。
这是我尝试过但时不时失败的突变。
mutation($id: Int!, $patch: PersonPatch!) {
updatePersonById(input: { id: $id, patch: $patch }) {
clientMutationId
}
}
变量
{
id: 1,
patch: {"name": "newname"}
}
我正在使用Altair GraphQL client
提交变异请求,返回的错误信息是"No values were updated in collection 'people' because no values were found."
id = 1
的人确实存在,通过向 personById
发送查询以获取他的名字来确认。但我无法更新他的名字。
编辑#1
下面是Altair GraphQL Client
updatePersonById(
input: UpdatePersonByIdInput!
): UpdatePersonPayload
input UpdatePersonByIdInput {
clientMutationId: String
patch: PersonPatch!
id: Int!
}
input PersonPatch {
id: Int
name: String
}
假设您正在使用行级安全性 (RLS),这听起来像是要更新的行没有通过当前经过身份验证的用户所需的安全策略。
这是一个小例子;您需要对其进行调整以适合您自己的权限系统
create table person (id serial primary key, name text);
alter table person enable row level security;
grant select, insert(name), update(name), delete on person to graphql;
create policy select_all on person for select using (true);
create policy insert_all on person for insert with check(true);
create policy update_self on person for update using (id = current_person_id());
create policy delete_self on person for delete using (id = current_person_id());
哪里
create function current_person_id() returns int as $$
select nullif(current_setting('jwt.claims.person_id', true), '')::int;
$$ language sql stable;
如果您需要更多指导,请随时进入 the Graphile chat。