如何从SQL查询字符串中提取指定字段值并转为字典
提取SQL字符串中指定字段的值
给定SQL语句字符串:
msg = "INSERT INTO hires (id, hire_ts, user, hired_by) VALUES ('12341234-1234-1234-1234-123412341234'::uuid::UUID, '2023-01-01T10:00:00.000000'::timestamp, 'doh', 'jason')"
已通过正则提取出字段列表和值列表的字符串:
import re pattern = r"\(([^\)]+)\)" re_msg = re.findall(pattern, msg) # re_msg结果: # ['id, hire_ts, user, hired_by', "'12341234-1234-1234-1234-123412341234'::uuid::UUID, '2023-01-01T10:00:00.000000'::timestamp, 'doh', 'jason'"]
要将其转换为只包含user和hired_by的目标字典:
dict_msg = { "user": "doh", "hired_by": "jason" }
实现步骤
第一步:拆分字段名和值为对应列表
把re_msg中的两个字符串分别按逗号拆分,同时清理每个元素的前后空格:# 拆分字段名列表 fields = [field.strip() for field in re_msg[0].split(',')] # 拆分值列表 values = [val.strip() for val in re_msg[1].split(',')]第二步:清洗值内容
去掉值字符串中的单引号,以及PostgreSQL的类型转换后缀(比如::uuid::UUID、::timestamp):cleaned_values = [] for val in values: # 先去掉首尾单引号 val = val.strip("'") # 去掉::开头的类型转换部分 if '::' in val: val = val.split('::')[0] cleaned_values.append(val)第三步:构建完整字典并筛选目标字段
先把字段和清洗后的值配对成完整字典,再提取需要的键:full_dict = dict(zip(fields, cleaned_values)) # 筛选出需要的字段 dict_msg = {key: full_dict[key] for key in ['user', 'hired_by']}
完整代码
import re msg = "INSERT INTO hires (id, hire_ts, user, hired_by) VALUES ('12341234-1234-1234-1234-123412341234'::uuid::UUID, '2023-01-01T10:00:00.000000'::timestamp, 'doh', 'jason')" pattern = r"\(([^\)]+)\)" re_msg = re.findall(pattern, msg) # 拆分并清理字段和值 fields = [f.strip() for f in re_msg[0].split(',')] values = [v.strip() for v in re_msg[1].split(',')] # 清洗值 cleaned_values = [] for val in values: val = val.strip("'") if '::' in val: val = val.split('::')[0] cleaned_values.append(val) # 构建目标字典 full_dict = dict(zip(fields, cleaned_values)) dict_msg = {k: full_dict[k] for k in ['user', 'hired_by']} print(dict_msg) # 输出: {'user': 'doh', 'hired_by': 'jason'}
内容的提问来源于stack exchange,提问作者ohh
相关产品推荐
相关产品推荐

