【Python】python检查文件夹下所有sql文件内容里面是否包含update、delete、truncate语句✅ 代码解释 使用方法⚠️ 注意事项python检查文件夹下所有sql文件内容里面是否包含update、delete、truncate语句如果有把涉及的表名提取出来使用 Python 遍历指定文件夹下的所有.sql文件逐行读取内容查找是否包含UPDATE、DELETE或TRUNCATE语句并通过简单的正则表达式提取这些语句中涉及的表名。以下是一个完整的实现方案importosimportrefrompathlibimportPath# 正则表达式匹配 UPDATE/DELETE/TRUNCATE 语句中的表名# 支持简单格式如# UPDATE table_name SET ...# DELETE FROM table_name WHERE ...# TRUNCATE TABLE table_namepattern_updatere.compile(r\bUPDATE\s([a-zA-Z_][a-zA-Z0-9_\.\s]*?)(?:\sSET|\sWHERE),re.IGNORECASE)pattern_deletere.compile(r\bDELETE\sFROM\s([a-zA-Z_][a-zA-Z0-9_\.\s]*?)(?:\sWHERE|\sLIMIT|$|;),re.IGNORECASE)pattern_truncatere.compile(r\bTRUNCATE\s(?:TABLE)?\s([a-zA-Z_][a-zA-Z0-9_\.\s]*?)(?:$|;|\s),re.IGNORECASE)defextract_tables_from_sql_content(content): 从 SQL 内容中提取 UPDATE/DELETE/TRUNCATE 涉及的表名 返回一个字典包含语句类型和对应的表名列表 tables{UPDATE:[],DELETE:[],TRUNCATE:[]}# 查找 UPDATE 语句中的表名formatchinpattern_update.finditer(content):tablematch.group(1).strip()iftable:tables[UPDATE].append(table)# 查找 DELETE 语句中的表名formatchinpattern_delete.finditer(content):tablematch.group(1).strip()iftable:tables[DELETE].append(table)# 查找 TRUNCATE 语句中的表名formatchinpattern_truncate.finditer(content):tablematch.group(1).strip()iftable:tables[TRUNCATE].append(table)# 去重forkeyintables:tables[key]list(set(tables[key]))returntablesdefscan_folder_for_sql_files(folder_path): 遍历文件夹下所有 .sql 文件检查并提取危险语句涉及的表名 folderPath(folder_path)ifnotfolder.exists():print(f错误路径{folder_path}不存在。)returnifnotfolder.is_dir():print(f错误{folder_path}不是一个文件夹。)returnfound_dangerous_statementsFalse# 遍历所有 .sql 文件包括子目录forsql_fileinfolder.rglob(*.sql):print(f\n 检查文件:{sql_file})try:withopen(sql_file,r,encodingutf-8)asf:contentf.read()# 提取表名tablesextract_tables_from_sql_content(content)# 统计是否有危险语句has_dangerousany(tables[cmd]forcmdintables)ifhas_dangerous:found_dangerous_statementsTrueprint(⚠️ 发现危险操作:)forcmdintables:iftables[cmd]:print(f{cmd}:{, .join(tables[cmd])})else:print(✅ 未发现 UPDATE/DELETE/TRUNCATE 语句)exceptExceptionase:print(f❌ 读取文件{sql_file}时出错:{e})ifnotfound_dangerous_statements:print(\n 恭喜未在任何 SQL 文件中发现 UPDATE、DELETE 或 TRUNCATE 语句。)# 示例调用if__name____main__:folderyour_sql_folder_here# 修改为你的 SQL 文件夹路径scan_folder_for_sql_files(folder)✅ 代码解释正则表达式说明pattern_update匹配UPDATE 表名 SET ...或UPDATE 表名 WHERE ...pattern_delete匹配DELETE FROM 表名 WHERE ...pattern_truncate匹配TRUNCATE TABLE 表名或TRUNCATE 表名函数功能extract_tables_from_sql_content(content)从一段 SQL 文本中提取三类语句的表名。scan_folder_for_sql_files(folder_path)递归扫描文件夹中所有.sql文件并分析。去重处理使用set去除重复表名。编码安全使用utf-8编码打开文件避免中文乱码。错误处理捕获文件读取异常如权限问题、编码错误等。路径处理使用Path.rglob()实现递归遍历子目录。 使用方法将上述代码保存为check_sql_danger.py修改folder your_sql_folder_here为你实际的 SQL 文件夹路径例如folder./sql_scripts运行脚本python check_sql_danger.py输出示例 检查文件: ./sql_scripts/update_user.sql ⚠️ 发现危险操作: UPDATE: users 检查文件: ./sql_scripts/cleanup.sql ⚠️ 发现危险操作: DELETE: logs TRUNCATE: temp_data ✅ 未发现 UPDATE/DELETE/TRUNCATE 语句⚠️ 注意事项当前正则仅适用于标准格式的 SQL复杂嵌套或换行较多的情况可能漏检。若需支持更多方言如 PostgreSQL 的TRUNCATE ONLY ...可扩展正则。对于大型文件建议逐行读取而非一次性加载全文可优化内存使用。
【Python】python检查文件夹下所有sql文件内容里面是否包含update、delete、truncate语句
【Python】python检查文件夹下所有sql文件内容里面是否包含update、delete、truncate语句✅ 代码解释 使用方法⚠️ 注意事项python检查文件夹下所有sql文件内容里面是否包含update、delete、truncate语句如果有把涉及的表名提取出来使用 Python 遍历指定文件夹下的所有.sql文件逐行读取内容查找是否包含UPDATE、DELETE或TRUNCATE语句并通过简单的正则表达式提取这些语句中涉及的表名。以下是一个完整的实现方案importosimportrefrompathlibimportPath# 正则表达式匹配 UPDATE/DELETE/TRUNCATE 语句中的表名# 支持简单格式如# UPDATE table_name SET ...# DELETE FROM table_name WHERE ...# TRUNCATE TABLE table_namepattern_updatere.compile(r\bUPDATE\s([a-zA-Z_][a-zA-Z0-9_\.\s]*?)(?:\sSET|\sWHERE),re.IGNORECASE)pattern_deletere.compile(r\bDELETE\sFROM\s([a-zA-Z_][a-zA-Z0-9_\.\s]*?)(?:\sWHERE|\sLIMIT|$|;),re.IGNORECASE)pattern_truncatere.compile(r\bTRUNCATE\s(?:TABLE)?\s([a-zA-Z_][a-zA-Z0-9_\.\s]*?)(?:$|;|\s),re.IGNORECASE)defextract_tables_from_sql_content(content): 从 SQL 内容中提取 UPDATE/DELETE/TRUNCATE 涉及的表名 返回一个字典包含语句类型和对应的表名列表 tables{UPDATE:[],DELETE:[],TRUNCATE:[]}# 查找 UPDATE 语句中的表名formatchinpattern_update.finditer(content):tablematch.group(1).strip()iftable:tables[UPDATE].append(table)# 查找 DELETE 语句中的表名formatchinpattern_delete.finditer(content):tablematch.group(1).strip()iftable:tables[DELETE].append(table)# 查找 TRUNCATE 语句中的表名formatchinpattern_truncate.finditer(content):tablematch.group(1).strip()iftable:tables[TRUNCATE].append(table)# 去重forkeyintables:tables[key]list(set(tables[key]))returntablesdefscan_folder_for_sql_files(folder_path): 遍历文件夹下所有 .sql 文件检查并提取危险语句涉及的表名 folderPath(folder_path)ifnotfolder.exists():print(f错误路径{folder_path}不存在。)returnifnotfolder.is_dir():print(f错误{folder_path}不是一个文件夹。)returnfound_dangerous_statementsFalse# 遍历所有 .sql 文件包括子目录forsql_fileinfolder.rglob(*.sql):print(f\n 检查文件:{sql_file})try:withopen(sql_file,r,encodingutf-8)asf:contentf.read()# 提取表名tablesextract_tables_from_sql_content(content)# 统计是否有危险语句has_dangerousany(tables[cmd]forcmdintables)ifhas_dangerous:found_dangerous_statementsTrueprint(⚠️ 发现危险操作:)forcmdintables:iftables[cmd]:print(f{cmd}:{, .join(tables[cmd])})else:print(✅ 未发现 UPDATE/DELETE/TRUNCATE 语句)exceptExceptionase:print(f❌ 读取文件{sql_file}时出错:{e})ifnotfound_dangerous_statements:print(\n 恭喜未在任何 SQL 文件中发现 UPDATE、DELETE 或 TRUNCATE 语句。)# 示例调用if__name____main__:folderyour_sql_folder_here# 修改为你的 SQL 文件夹路径scan_folder_for_sql_files(folder)✅ 代码解释正则表达式说明pattern_update匹配UPDATE 表名 SET ...或UPDATE 表名 WHERE ...pattern_delete匹配DELETE FROM 表名 WHERE ...pattern_truncate匹配TRUNCATE TABLE 表名或TRUNCATE 表名函数功能extract_tables_from_sql_content(content)从一段 SQL 文本中提取三类语句的表名。scan_folder_for_sql_files(folder_path)递归扫描文件夹中所有.sql文件并分析。去重处理使用set去除重复表名。编码安全使用utf-8编码打开文件避免中文乱码。错误处理捕获文件读取异常如权限问题、编码错误等。路径处理使用Path.rglob()实现递归遍历子目录。 使用方法将上述代码保存为check_sql_danger.py修改folder your_sql_folder_here为你实际的 SQL 文件夹路径例如folder./sql_scripts运行脚本python check_sql_danger.py输出示例 检查文件: ./sql_scripts/update_user.sql ⚠️ 发现危险操作: UPDATE: users 检查文件: ./sql_scripts/cleanup.sql ⚠️ 发现危险操作: DELETE: logs TRUNCATE: temp_data ✅ 未发现 UPDATE/DELETE/TRUNCATE 语句⚠️ 注意事项当前正则仅适用于标准格式的 SQL复杂嵌套或换行较多的情况可能漏检。若需支持更多方言如 PostgreSQL 的TRUNCATE ONLY ...可扩展正则。对于大型文件建议逐行读取而非一次性加载全文可优化内存使用。