python脚本多个文件夹下多个文件中sql语句片段比对

一、需求:

日常测试授权脚本,需要检查多个行业文件夹下单独的授权脚本和汇总授权脚本,一个文件根目录下有多个子文件夹,子文件夹下有多个sql文件,人为比对较为耗时。

需要实现在文件中找到某个sql语句片段,然后遍历比对此sql语句片段在各目录各文件中是否一致。

二、思路:

该脚本将遍历根目录下的所有子文件夹中的 SQL 文件,检查在根目录下的多个文件中是否都存在匹配的 SQL 语句,并在找到匹配的文件时输出相应路径信息。

三、python代码

import os

#遍历各目录各文件,寻找有此sql语句的文件,并打印出对应文件的路径
def find_sql(root_dir, sql_fragment):
    for dirpath, dirnames, filenames in os.walk(root_dir):
        for filename in filenames:
            if filename.endswith(".sql"):
                filepath = os.path.join(dirpath, filename)
                try:
                    with open(filepath, 'r', encoding='utf-8') as file:
                        sql_content = file.read()
                        if sql_fragment in sql_content:
                            print("在文件 {} 中找到了指定的 SQL 语句片段:{}".format(os.path.abspath(filepath), sql_fragment))
                            compare_sql_in_files(root_dir, sql_fragment)
                            return
                except UnicodeDecodeError:
                    try:
                        with open(filepath, 'r', encoding='utf-8-sig') as file:
                            sql_content = file.read()
                            if sql_fragment in sql_content:
                                print("在文件 {} 中找到了指定的 SQL 语句片段:{}".format(os.path.abspath(filepath), sql_fragment))
                                compare_sql_in_files(root_dir, sql_fragment)
                                return
                    except UnicodeDecodeError:
                        with open(filepath, 'r', encoding='gbk') as file:
                            sql_content = file.read()
                            if sql_fragment in sql_content:
                                print("在文件 {} 中找到了指定的 SQL 语句片段:{}".format(os.path.abspath(filepath), sql_fragment))
                                compare_sql_in_files(root_dir, sql_fragment)
                                return
    print("未找到指定的 SQL 语句片段:{}".format(sql_fragment))
#包含此sql语句的文件进行内容比对
def compare_sql_in_files(root_dir, sql_fragment):
    for dirpath, dirnames, filenames in os.walk(root_dir):
        for filename in filenames:
            if filename.endswith(".sql"):
                filepath = os.path.join(dirpath, filename)
                try:
                    with open(filepath, 'r', encoding='utf-8') as file:
                        sql_content = file.read()
                        if sql_fragment in sql_content:
                            print("在文件 {} 中找到了与指定的 SQL 语句片段一致的内容".format(os.path.abspath(filepath)))
                except UnicodeDecodeError:
                    try:
                        with open(filepath, 'r', encoding='utf-8-sig') as file:
                            sql_content = file.read()
                            if sql_fragment in sql_content:
                                print("在文件 {} 中找到了与指定的 SQL 语句片段一致的内容".format(os.path.abspath(filepath)))
                    except UnicodeDecodeError:
                        with open(filepath, 'r', encoding='gbk') as file:
                            sql_content = file.read()
                            if sql_fragment in sql_content:
                                print("在文件 {} 中找到了与指定的 SQL 语句片段一致的内容".format(os.path.abspath(filepath)))

# 在此处指定根目录和要查找的 SQL 语句片段
root_dir = "D:/hswork/PB2.0/环境搭建_任务/svn脚本/202301.03版本/升级脚本-2023-11-21/升级脚本/01开通脚本/"    #授权文件根目录
sql_fragment = "update pub_tsysparameter set visible_flag='1'  where sysparam_no = 400264;"   #要查找的 SQL 语句片段

# 调用函数开始查找和比对
find_sql(root_dir, sql_fragment)
四、使用

将 根目录 替换为实际的根目录路径,并将 要查找的 SQL 语句片段 替换为实际要查找的 SQL 语句片段。

五、实现效果