说我有一个表Person,其属性为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
来确认其姓名来确认。但是我只是无法更新他的名字。
下面是Altair GraphQL Client
产生的gql
updatePersonById(
input: UpdatePersonByIdInput!
): UpdatePersonPayload
input UpdatePersonByIdInput {
clientMutationId: String
patch: PersonPatch!
id: Int!
}
input PersonPatch {
id: Int
name: String
}
答案 0 :(得分:0)
假设您使用的是行级安全性(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。