如何针对 JSON 或 JSON 行对 SQL 样式查询使用模式匹配

问题描述

JSONJSON lines 形式的数据开始,我想使用 structural pattern matching 对其运行查询

例如,在运行 json.load() 后,我得到一个结构如下的字典:

publications = {
    'location': 'central library','items': [
        {'kind': 'book','title': 'Python in Aviation'},{'kind': 'magazine','title': 'Flying Monthly','issues': 15},{'kind': 'book','title': 'Python for Rock climbers'},'title': 'Weekly climber','issues': 42},]
}

我想要做的是应用 Python 3.10 的结构模式匹配提取相关数据很多 like 我会用这个 sql 查询

SELECT title,issues FROM Publications WHERE kind = "magazine";

解决方法

映射模式

解决方案的关键是应用mapping patterns。根据 PEP 634,它们具有以下形式:

mapping_pattern: '{' [items_pattern] '}'
items_pattern: ','.key_value_pattern+ ','?
key_value_pattern:
    | (literal_pattern | value_pattern) ':' pattern
    | double_star_pattern
double_star_pattern: '**' capture_pattern

在日常用语中,这意味着“用花括号编写字典,为要匹配的值输入常量,并为要提取的字段输入变量。”

制定的例子

使用问题中提供的数据,您将如何翻译所请求的 SQL 查询:

for item in publications['items']:
    match item:
        case {'kind': 'magazine','title': title,'issues': issues}:
            print(f'{title} has {issues} issues on hand')

这会过滤项目以仅包含杂志。然后它提取 titleissues 字段。这输出:

Flying Monthly has 15 issues on hand
Weekly Climber has 42 issues on hand