我正在实施' 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
,我知道请求数据无效并且可以将其丢弃。我需要为我拥有的每个表/资源执行此操作。
我想知道是否有更好的方法。
答案 0 :(得分: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})
这只是获得灵感的基础,这些类可以扩展到更多。
答案 1 :(得分: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)