Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过补丁进行部分更新:如何解析JSON数据进行SQL更新?_Python_Json_Api_Rest_Http Patch - Fatal编程技术网

Python 通过补丁进行部分更新:如何解析JSON数据进行SQL更新?

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

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

假设我没有在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": "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)