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

如何使用Python对比SQL文件和包,忽略格式差异返回True或False

Oracle SQL 脚本忽略格式差异对比解决方案

问题原因

你当前使用的difflib.Differ和filecmp都是基于原始文本的字节/行级对比,无法自动忽略缩进、换行、大小写、多余空格这类不影响SQL执行逻辑的格式差异,所以会出现逻辑相同的脚本被判定为不一致的情况。

解决思路

先对两个SQL文件的内容做标准化清洗,消除所有非功能性的格式差异后,再对比清洗结果是否完全一致即可。
标准化清洗规则如下:

  • 统一转为全大写,适配Oracle SQL大小写不敏感的语法特性
  • 将所有连续的空白字符(换行、制表符、多个空格)统一替换为单个空格
  • 去除括号前后的多余空格,消除括号换行拆分带来的差异
  • 可选扩展:如果需要忽略注释,可以额外过滤--开头的单行注释和/* */包裹的多行注释

优化后代码

import re

def comparesqlpkg(pkg1Name, pkg2Name):
    def standardize_sql(sql_content):
        # 转全大写
        sql = sql_content.upper()
        # 替换所有连续空白为单个空格
        sql = re.sub(r'\s+', ' ', sql)
        # 去掉括号前后的空格
        sql = re.sub(r'\s*\(\s*', '(', sql)
        sql = re.sub(r'\s*\)\s*', ')', sql)
        # 去掉首尾多余空格
        return sql.strip()
    
    # 读取两个文件内容
    with open(pkg1Name, 'r', encoding='utf-8') as f1, open(pkg2Name, 'r', encoding='utf-8') as f2:
        sql1 = f1.read()
        sql2 = f2.read()
    
    # 标准化后对比
    if standardize_sql(sql1) == standardize_sql(sql2):
        print("SAME content.")
        return True
    else:
        print("DIFFERENT content.")
        return False

效果验证

你给出的两个示例SQL如果是纯格式差异,经过标准化处理后输出结果完全一致,会被判定为相同。注:你给出的示例2中参数名写为IN_SCR_AMT属于拼写差异,会被判定为不同,属于符合预期的逻辑差异校验。

内容的提问来源于stack exchange,提问作者Chris Chance

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:45:03