【发布时间】:2015-07-20 18:43:20
【问题描述】:
我正在服务器端实施“PATCH”以对我的资源进行部分更新。
假设我不在 JSON 请求/响应中公开我的 SQL 数据库模式,即 JSON 中的键和表的列之间存在单独的映射,我如何最好地找出哪一列( s) 给定部分更新的 JSON 在 SQL 中更新?
例如,假设我的表有3列:col_a、col_b和col_c,JSON键到表列的映射为:a -> col_a, b -> col_b, c -> col_c。给定JSON-PATCH 数据:
[
{"op": "replace", "path": "/b", "value": "some_new_value"}
]
以编程方式将此部分更新应用到与我的资源对应的表的col_b 的最佳方法是什么?
当然,我可以将这些映射硬编码到某个地方的 keys_to_columns dict 中,并且在每个请求带有一些 patch_data 时,我可以这样做:
mapped_updates = {keys_to_columns[p['path'].split('/')[-1]]: p['value'] for p in patch_data}
然后使用mapped_updates 构造数据库更新的SQL 语句。如果上面抛出 KeyError 我知道请求数据无效并且可以将其丢弃。我需要为我拥有的每个表/资源执行此操作。
不知道有没有更好的办法。
【问题讨论】:
-
我猜你想要这个抽象层,这样你就可以灵活地更改数据库架构而不影响 REST API?
-
@MartinKonecny,是的,另外,我可能只是想对 API 用户隐藏 DB 模式的语义。
-
我认为您需要的是位于数据库之上的第 3 层,它可以序列化并执行您的查询/更新,并在 API 级别以您想要的形式表示数据。例如:JSON Schema 这很好,因为您还可以验证、记录和保持资源和 API 的灵活性。
-
@JamesMills,好点子,所以我查了一下:python-jsonschema.readthedocs.org/en/latest,它似乎根据预定义的 JSON 模式验证了一段 JSON 数据。这很好,但我认为我真正需要的是验证器和解析器的组合,它只检查允许的 JSON 键,并将这些键解析到它们相应的数据库列。您是否知道任何现有的解决方案或者我需要自己编写?
标签: python json api rest http-patch