You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python提取SQL查询中的属性并批量保存到文件?

用Python处理SQL查询提取字段的解决方案

嘿,我来帮你搞定这个需求!要从1000条SQL SELECT语句里提取所有出现的属性字段并格式化输出,咱们可以用Python结合正则表达式来实现,步骤清晰又高效。

实现思路

核心思路是拆解每条SQL语句,分别提取SELECT子句里的字段和WHERE子句里涉及的字段,去重后按要求格式打包:

  1. 读取输入文件的每条SQL语句;
  2. 匹配SELECT后的字段列表;
  3. 匹配WHERE子句里的所有列名(过滤掉关键字和常量值);
  4. 合并两个部分的字段并去重,保持合理的顺序;
  5. 将结果格式化为(字段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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:05:07