如何使用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
相关产品推荐
相关产品推荐

