通过PATCH进行部分更新:如何解析SQL更新的JSON数据?

MLi*_*ter 10 python api rest json http-patch

我正在服务器端实现'PATCH'以部分更新我的资源.

假设我没有在JSON请求/响应中公开我的SQL数据库模式,即JSON中的键和表的列之间存在单独的映射,如何在SQL中给出JSON的最佳数据,以便最好地确定要更新的列.部分更新?

例如,假设我的表有3列:col_a,col_bcol_c,并且JSON键与表列之间的映射是:a -> col_a, b -> col_b, c -> col_c.鉴于JSON-PATCH数据:

[
    {"op": "replace", "path": "/b", "value": "some_new_value"}
]
Run Code Online (Sandbox Code Playgroud)

以编程方式将此部分更新应用于col_b与我的资源相对应的表的最佳方法是什么?

当然,我可以在keys_to_columns某个地方的dict 中对这些映射进行硬编码,并且根据每个请求patch_data,我可以这样做:

mapped_updates = {keys_to_columns[p['path'].split('/')[-1]]: p['value'] for p in patch_data}
Run Code Online (Sandbox Code Playgroud)

然后用于mapped_updates构建用于数据库更新的SQL语句.如果上面抛出一个KeyError我知道请求数据无效并且可以扔掉它.我需要为我拥有的每个表/资源执行此操作.

我想知道是否有更好的方法.

sir*_*rfz 1

这与您想要做的类似,但您可以为每个表创建类,而不是创建映射。例如:

class Table(object):
    """Parent class of all tables"""

    def get_columns(self, **kwargs):
        return {getattr(self, k): v for k, v in kwargs.iteritems()}

class MyTable(Table):
    """table MyTable"""

    # columns mapping
    a = "col_a"
    b = "col_b"

tbl = MyTable()
tbl.get_columns(a="value a", b="value b")
# the above returns {"col_a": "value a", "col_b": "value b"}
# similarly:
tbl.get_columns(**{p['path'].split('/')[-1]: p['value'] for p in patch_data})
Run Code Online (Sandbox Code Playgroud)

这只是从中获得灵感的基本内容,这些类可以扩展以做更多事情。