如何用Python提取SQL查询中的属性并批量保存到文件?
用Python处理SQL查询提取字段的解决方案
嘿,我来帮你搞定这个需求!要从1000条SQL SELECT语句里提取所有出现的属性字段并格式化输出,咱们可以用Python结合正则表达式来实现,步骤清晰又高效。
实现思路
核心思路是拆解每条SQL语句,分别提取SELECT子句里的字段和WHERE子句里涉及的字段,去重后按要求格式打包:
- 读取输入文件的每条SQL语句;
- 匹配
SELECT后的字段列表; - 匹配
WHERE子句里的所有列名(过滤掉关键字和常量值); - 合并两个部分的字段并去重,保持合理的顺序;
- 将结果格式化为
(字段1,字段2,...)的形式,写入输出文件。
完整代码实现
import re def process_single_sql(sql): # 定义需要排除的SQL关键字和运算符 excluded_words = {'select', 'from', 'where', 'and', 'or', '=', '>', '<', '>=', '<=', '!=', '<>', 'like', 'in', 'not', 'is', 'null', 'between', 'group', 'by', 'order', 'having', 'limit', 'offset', 'as'} # 提取SELECT子句中的字段 select_pattern = re.compile(r'select\s+(.*?)\s+from', re.IGNORECASE | re.DOTALL) select_match = select_pattern.search(sql) select_fields = [] if select_match: # 分割字段并去除多余空格 select_fields = [field.strip() for field in select_match.group(1).split(',')] # 提取WHERE子句中的字段 where_pattern = re.compile(r'where\s+(.*)$', re.IGNORECASE | re.DOTALL) where_match = where_pattern.search(sql) where_fields = [] if where_match: where_content = where_match.group(1) # 先移除所有字符串常量(避免误匹配带引号的内容) where_content_no_quotes = re.sub(r"'[^']*'", '', where_content) # 匹配所有列名(支持`表名.列名`或单独`列名`的格式) column_matches = re.findall(r'(\w+\.\w+|\w+)', where_content_no_quotes) # 过滤掉关键字和运算符 where_fields = [col for col in column_matches if col.lower() not in excluded_words] # 合并字段并去重,保留先SELECT后WHERE的顺序 seen_fields = set() final_fields = [] for field in select_fields + where_fields: # 统一小写判断去重,但保留原大小写输出 field_lower = field.lower() if field_lower not in seen_fields: seen_fields.add(field_lower) final_fields.append(field) # 格式化为要求的括号包裹形式 return f"({','.join(final_fields)})" # 处理文件 def process_sql_file(input_path, output_path): with open(input_path, 'r', encoding='utf-8') as infile, open(output_path, 'w', encoding='utf-8') as outfile: for line in infile: line = line.strip() if not line: continue # 跳过空行 processed_line = process_single_sql(line) outfile.write(processed_line + '\n') # 替换成你的输入输出文件路径 if __name__ == "__main__": input_file = "input_queries.txt" output_file = "output_fields.txt" process_sql_file(input_file, output_file) print("处理完成!结果已保存到", output_file)
注意事项
- SQL格式假设:代码默认每条SQL语句占一行,如果你的SQL是多行的,需要调整读取逻辑(比如按分号分割,但要注意字符串中的分号);
- 复杂SQL兼容:如果你的查询包含函数调用(比如
SELECT COUNT(salary)...)、子查询等,可能需要进一步优化正则表达式来排除这些情况; - 关键字扩展:如果你的SQL用到了其他关键字,可以手动添加到
excluded_words集合里,避免误识别为字段; - 大小写保留:代码会保留原SQL中字段的大小写(比如
first_name和First_Name会被视为不同字段,如果你想统一大小写,可以在去重时转换为小写,输出时也统一)。
内容的提问来源于stack exchange,提问作者Saif
相关产品推荐
相关产品推荐

