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

How use pattern matching for SQL style queries against JSON or JSON lines

JSON or JSON lines, I want to use structural pattern matching 到 运行 查询形式的数据开始。

例如,在 运行ning 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'},
        {'kind': 'magazine', '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