假设您有一个由 SQL 数据库支持的基本 API (GET/POST/PATCH/DELETE)。
PATCH 调用应该只更新用户发送的 JSON 有效负载中的字段,而不涉及任何其他字段。
想象一下表(我们称它为sample)有id,string_a和string_b列,与之对应的结构如下所示:
type Sample struct {
ID int `json:"id"`
StringA string `json:"stringA"`
StringB string `json:"stringB"`
}
假设用户{ "stringA": "patched value" }作为有效负载传入。json 将被解组为如下所示的内容:
&Sample{
ID: 0,
StringA: "patched value",
StringB: "",
}
对于使用 的项目database/sql,您将编写查询来修补行,例如:
// `id` is from the URL params
query := `UPDATE sample SET string_a=$1, string_b=$2 WHERE id=$3`
row := db.QueryRow(query, sample.StringA, sample.StringB, id)
...
该查询将按string_a预期更新该列,但它也会将该string_b列更新为"",在这种情况下这是不希望的行为。本质上,我只是创建了一个 PUT 而不是 PATCH。
我的直接想法是——好的,没关系,让我们用它strings.Builder来构建查询,只为那些具有非 nil/空值的语句添加一个 SET 语句。
但是,在那种情况下,如果用户想要string_a清空,他们将如何实现呢?
例如。用户使用有效负载进行 PATCH 调用{ "stringA": "" } 。这将被解组为:
&Sample{
ID: 0,
StringA: "",
StringB: "",
}
我理论化的“查询构建器”会看着它并说“好的,这些都是 nil/空值,不要将它们添加到查询中”并且不会更新任何列,这又是不受欢迎的行为。
我不确定如何编写我的 API 以及它以同时满足这两种情况的方式运行的 SQL 查询。有什么想法吗?
www说
慕斯709654
婷婷同学_
随时随地看视频慕课网APP
相关分类