如何将模式匹配用于针对 JSON 或 JSON 行的 SQL 样式查询
Posted
技术标签:
【中文标题】如何将模式匹配用于针对 JSON 或 JSON 行的 SQL 样式查询【英文标题】:How use pattern matching for SQL style queries against JSON or JSON lines 【发布时间】:2021-08-04 02:41:01 【问题描述】:从JSON 或JSON 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',
'kind': 'magazine', 'title': 'Weekly Climber', 'issues': 42,
]
我想做的是应用 Python 3.10 的结构模式匹配提取相关数据很多 like 我会用这个 SQL 查询:
SELECT title, issues FROM Publications WHERE kind = "magazine";
【问题讨论】:
【参考方案1】:映射模式
解决的关键是申请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')
这会过滤 items 以仅包括杂志。然后它提取 title 和 issues 字段。这输出:
Flying Monthly has 15 issues on hand
Weekly Climber has 42 issues on hand
【讨论】:
以上是关于如何将模式匹配用于针对 JSON 或 JSON 行的 SQL 样式查询的主要内容,如果未能解决你的问题,请参考以下文章