Python 通过补丁进行部分更新:如何解析JSON数据进行SQL更新?
我正在服务器端实施“补丁”,以部分更新我的资源 假设我没有在JSON请求/响应中公开我的SQL数据库模式,即JSON中的键和表的列之间存在单独的映射,那么在JSON部分更新的情况下,如何最好地确定要在SQL中更新哪些列 例如,假设我的表有3列:Python 通过补丁进行部分更新:如何解析JSON数据进行SQL更新?,python,json,api,rest,http-patch,Python,Json,Api,Rest,Http Patch,我正在服务器端实施“补丁”,以部分更新我的资源 假设我没有在JSON请求/响应中公开我的SQL数据库模式,即JSON中的键和表的列之间存在单独的映射,那么在JSON部分更新的情况下,如何最好地确定要在SQL中更新哪些列 例如,假设我的表有3列:col\u a、col\u b和col\u c,JSON键到表列的映射是:a->col\u a,b->col\u b,c->col c。给定JSON-PATCH数据: [ {"op": "replace", "path": "/b", "value
col\u a
、col\u b
和col\u c
,JSON键到表列的映射是:a->col\u a,b->col\u b,c->col c
。给定JSON-PATCH
数据:
[
{"op": "replace", "path": "/b", "value": "some_new_value"}
]
以编程方式将此部分更新应用于与我的资源对应的表的列
的最佳方法是什么
当然,我可以在某个地方将这些映射硬编码到键到列
dict中,并且在每次请求时使用一些补丁数据
,我可以执行以下操作:
mapped_updates = {keys_to_columns[p['path'].split('/')[-1]]: p['value'] for p in patch_data}
然后使用mapped\u updates
为DB update构造SQL语句。如果上面抛出一个KeyError
,我知道请求数据无效,可以将其丢弃。我需要为我拥有的每个表/资源都这样做
我想知道是否有更好的方法。这与您想做的类似,但是您可以为每个表创建类,而不是创建映射。例如:
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})
这只是一些基本的启发,这些类可以扩展以做更多的事情。我想你需要这个抽象层,这样你就可以在不影响REST API的情况下灵活地更改DB模式?@MartinKonecny,是的,我可能只是想对API用户隐藏DB模式的语义。我认为您需要的是位于DB之上的第三层,它序列化并执行查询/更新,并在API级别以您想要的形式表示数据。e、 g:这很好,因为您还可以验证、记录并保持资源和API的灵活性。@JamesMills,很好,所以我查找这个:,它似乎可以根据预定义的JSON模式验证一段JSON数据。这很好,但我认为我真正需要的是验证器和解析器的组合,它只检查允许的JSON键,并将这些键解析到它们对应的DB列。您是否知道任何现有的解决方案,或者我需要编写自己的解决方案?谢谢您的回答。我不是在寻找我给出的玩具示例的具体代码(我已经给出了解决方案),我更感兴趣的是解决这个问题的最佳方法(例如设计模式、库等)。我认为,litle问题不需要特别的解决方案。谢谢你的回答。我不是在寻找我给出的玩具示例的特定代码(我已经给出了解决方案),我更感兴趣的是最好的方法(例如设计模式、库等)对于这个问题,更好的方法是为您的数据库表定义类,类似于我的示例,在这里您可以清晰地、pythonical地定义字段映射。通过在父类中添加必要时可重写的泛型方法,还可以扩展类的功能。
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)