首页 > 解决方案 > 有没有一种惯用的方法来更新 PostgreSQL 中的某些字段?

问题描述

有没有什么好的方法可以UPDATE请求包含可选数据?我现在拥有的是:

{
    "id": "203ede72-45af-4029-8055-e1c43656d42d",
    "first_name": "Willdon",
    "last_name": "Surgey"
},
-- UPDATE
create or replace
function update_author(target_id uuid, i_first_name varchar(50), i_last_name varchar(50))
returns json
language plpgsql
as
$$
declare inserted_author authors%rowtype;
begin
     update authors a
     set first_name = i_first_name,
          last_name = i_last_name
     where a.id = target_id
     returning * into inserted_author;

return row_to_json(inserted_author);
end;
$$;

现在,如果我在with bodyPUT处提出请求/author/203ede72-45af-4029-8055-e1c43656d42d

{
    "last_name": "Smith"
}

它成为了

{
    "id": "203ede72-45af-4029-8055-e1c43656d42d",
    "first_name": "",
    "last_name": "Smith"
}

first_name如果仅last_name提供,我希望它保留

标签: sqldatabasepostgresql

解决方案


我最终做的是我最初author从数据库中查询了完整的对象,然后使用golang'sUnmarshal来选择性地更改属性,然后将完整的数据传递给 postgres 函数。

注意:如果您使用此解决方法,请务必进行某种验证,以便您的用户无法使用类似的查询破坏您的数据库 PUT /author/f3ef41a5-fe1e-4180-92bf-8b87e879211d

{
    "id": "g3ef41a5-fe1e-4180-92bf-8b87e879211d",
    "last_name": "Smith"
}

请注意,UUID 的第一个字母已更改,这可能会破坏内容。


推荐阅读