10

我正在服务器端实现“补丁”以部分更新我的资源。

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

例如,假设我的表有 3 列:col_acol_bcol_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我知道请求数据是无效的,可以把它扔掉。我需要为我拥有的每个表/资源执行此操作。

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

4

2 回答 2

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})

这只是一些基本的启发,这些类可以扩展以做更多的事情。

于 2015-05-12T19:26:13.190 回答
1
patch_json = [
    {"op": "replace", "path": "/b", "value": "some_new_value"},
    {"op": "replace", "path": "/a", "value": "some_new_value2"}
]

def fix_key(item):
    item['path'] = item['path'].replace('/', 'col_')
    return item

print map(fix_key, patch_json)
于 2015-05-15T17:33:21.773 回答