如何针对 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')
这会过滤 项 以仅包含杂志。然后提取 title 和 issues 字段。这输出:
Flying Monthly has 15 issues on hand
Weekly Climber has 42 issues on hand
从 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')
这会过滤 项 以仅包含杂志。然后提取 title 和 issues 字段。这输出:
Flying Monthly has 15 issues on hand
Weekly Climber has 42 issues on hand