使用Python编写一个SQL语句自动转换工具(UPDATE到INSERT转换)

Written by

in

文章目录
  • 在日常数据库维护和数据处理过程中,我们经常需要将UPDATE语句转换为INSERT语句,特别是在数据迁移、备份恢复或测试数据准备的场景中。手动转换这些SQL语句不仅耗时耗力,还容易出错。本文将介绍如何使用Python编写一个自动化工具,实现UPDATE语句到INSERT语句的高效转换。
  • 假设我们有一个包含大量UPDATE语句的SQL文件: UPDATE `xxx_detail` SET `id`=1955445664111890432, `product_name`=’xxx’, `update_time`=’2025-08-23 13:37:44′ WHERE `id`=1955445664111890432; UPDATE `contracxxxt` SET `order_sn`=’xxxxx’, `total_amount`=1816485 WHERE `id`=1955445671208652800; 我们需要将这些语句转换为INSERT语句: INSERT INTO `xxx_detail` (`id`, `product_name`, `update_time`) VALUES (1955445664111890432, ‘xxx’, ‘2025-08-23 13:37:44’); INSERT INTO `contracxxxt` (`order_sn`, `total_amount`) VALUES (‘xxxxx’, 1816485);
  • import re import os def update_to_insert(sql_content): “””将UPDATE语句转换为INSERT语句””” # 正则表达式匹配UPDATE语句 update_pattern = r’UPDATE `(w+)` SET (.+?) WHERE `id`=(d+);’ matches = re.findall(update_pattern, sql_content, re.DOTALL) insert_statements = [] for table_name, set_clause, id_value in matches: # 解析SET子句 set_items = re.findall(r’`(w+)`=([^,]+)(?:,|$)’, set_clause) # 构建列名和值 columns = [] values = [] for column, value in set_items: columns.append(f”`{column}`”) # 处理NULL值 value = value.strip() if value.upper() == ‘NULL’: values.append(‘NULL’) # 处理字符串值(用单引号括起来的) elif re.match(r”^’.*’$”, value): # 去除外层单引号,然后重新添加正确的单引号 inner_value = value[1:-1] # 去掉外层单引号 # 转义内部单引号 escaped_value = inner_value.replace(“‘”, “””) values.append(f”‘{escaped_value}'”) # 处理数字值 else: values.append(value) # 构建INSERT语句 insert_sql = f”INSERT INTO `{table_name}` ({‘, ‘.join(columns)}) VALUES ({‘, ‘.join(values)});” insert_statements.append(insert_sql) return insert_statements def process_sql_file(input_file, output_file): “””处理SQL文件,将UPDATE转换为INSERT””” # 检查输入文件是否存在 if not os.path.exists(input_file): print(f”错误:输入文件 ‘{input_file}’ 不存在”) return try: # 读取输入文件 with open(input_file, ‘r’, encoding=’utf-8′) as f: sql_content = f.read() # 转换UPDATE语句 insert_statements = update_to_insert(sql_content) # 写入输出文件 with open(output_file, ‘w’, encoding=’utf-8′) as f: f.write(“– 由UPDATE语句生成的INSERT语句n”) f.write(“– 生成时间: 2025-09-27n”) f.write(“– 源文件: ” + input_file + “n”) f.write(“=” * 80 + “nn”) for i, insert_stmt in enumerate(insert_statements, 1): f.write(f”– INSERT语句 {i}n”) f.write(insert_stmt + “n”) f.write(“n”) print(f”成功生成 {len(insert_statements)} 条INSERT语句”) print(f”输出文件: {output_file}”) except Exception as e: print(f”处理文件时出错: {e}”) def main(): “””主函数””” print(“UPDATE语句转INSERT语句工具”) print(“=” * 40) # 输入文件路径 input_file = input(“请输入包含UPDATE语句的文件路径: “).strip() # 输出文件路径(默认在输入文件同目录下) if input_file: base_name = os.path.splitext(input_file)[0] output_file = f”{base_name}_insert.sql” else: output_file = “output_insert.sql” # 确认输出文件路径 custom_output = input(f”请输入输出文件路径 (默认: {output_file}): “).strip() if custom_output: output_file = custom_output # 处理文件 process_sql_file(input_file, output_file) # 示例使用(直接指定文件路径) if __name__ == “__main__”: # 方式1:交互式输入 # main() # 方式2:直接指定文件路径 input_file = “./rollback_12681.sql” # 替换为你的文件路径 output_file = “output_insert.sql” process_sql_file(input_file, output_file)
  • 转换前(UPDATE语句): UPDATE `resource_detail` SET `id`=1955445664111890432, `product_name`=’热轧卷’, `update_time`=’2025-08-23 13:37:44′ WHERE `id`=1955445664111890432; 转换后(INSERT语句): INSERT INTO `resource_detail` (`id`, `product_name`, `update_time`) VALUES (1955445664111890432, ‘热轧卷’, ‘2025-08-23 13:37:44’);
  • 支持更多WHERE条件:当前仅支持id作为WHERE条件,可以扩展支持其他字段 批量处理:添加对目录下多个SQL文件的批量处理功能 数据库直连:添加直接连接数据库执行转换后的INSERT语句 语法检查:增加SQL语法验证功能,确保生成的INSERT语句有效 进度显示:添加进度条显示处理进度
  • 本文介绍的Python脚本提供了一个高效、可靠的UPDATE到INSERT语句转换解决方案。通过正则表达式和字符串处理技术,实现了SQL语句的自动转换,大大提高了数据库维护和数据处理效率。这个工具不仅适用于文中提到的场景,还可以根据具体需求进行扩展和定制。 使用这个工具时,请注意备份原始数据,并在测试环境中验证转换结果,确保数据准确性。 以上就是使用Python编写一个SQL语句自动转换工具(UPDATE到INSERT转换)的详细内容,更多关于Python SQL语句自动转换的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: 使用python将mysql数据库的数据转换为json数据的方法 Python实现把json格式转换成文本或sql文件 编写Python脚本把sqlAlchemy对象转换成dict的教程 python3图片转换二进制存入mysql
  • 目录
    • 引言
    • 问题背景
    • 解决方案设计
      • 核心思路
      • 关键技术点
    • 完整代码实现
      • 代码解析
        • 1. 正则表达式匹配
        • 2. SET子句解析
        • 3. 数据类型处理
        • 4. 文件操作
      • 使用示例
        • 交互式使用
        • 直接指定文件
      • 处理效果对比
        • 扩展功能建议
          • 总结

            在日常数据库维护和数据处理过程中,我们经常需要将UPDATE语句转换为INSERT语句,特别是在数据迁移、备份恢复或测试数据准备的场景中。手动转换这些SQL语句不仅耗时耗力,还容易出错。本文将介绍如何使用Python编写一个自动化工具,实现UPDATE语句到INSERT语句的高效转换。

            假设我们有一个包含大量UPDATE语句的SQL文件:

            UPDATE `xxx_detail` SET `id`=1955445664111890432, `product_name`='xxx', `update_time`='2025-08-23 13:37:44' WHERE `id`=1955445664111890432;
            UPDATE `contracxxxt` SET `order_sn`='xxxxx', `total_amount`=1816485 WHERE `id`=1955445671208652800;
            

            我们需要将这些语句转换为INSERT语句:

            INSERT INTO `xxx_detail` (`id`, `product_name`, `update_time`) VALUES (1955445664111890432, 'xxx', '2025-08-23 13:37:44');
            INSERT INTO `contracxxxt` (`order_sn`, `total_amount`) VALUES ('xxxxx', 1816485);
            

            1. 使用正则表达式匹配UPDATE语句的结构
            2. 提取表名、SET子句和WHERE条件
            3. 解析SET子句中的列名和值
            4. 构建INSERT语句格式

            • 正则表达式匹配
            • 字符串处理
            • 文件读写操作
            • 错误处理机制

            import re
            import os
            
            def update_to_insert(sql_content):
                """将UPDATE语句转换为INSERT语句"""
                
                # 正则表达式匹配UPDATE语句
                update_pattern = r'UPDATE `(w+)` SET (.+?) WHERE `id`=(d+);'
                matches = re.findall(update_pattern, sql_content, re.DOTALL)
                
                insert_statements = []
                
                for table_name, set_clause, id_value in matches:
                    # 解析SET子句
                    set_items = re.findall(r'`(w+)`=([^,]+)(?:,|$)', set_clause)
                    
                    # 构建列名和值
                    columns = []
                    values = []
                    
                    for column, value in set_items:
                        columns.append(f"`{column}`")
                        
                        # 处理NULL值
                        value = value.strip()
                        if value.upper() == 'NULL':
                            values.append('NULL')
                        # 处理字符串值(用单引号括起来的)
                        elif re.match(r"^'.*'$", value):
                            # 去除外层单引号,然后重新添加正确的单引号
                            inner_value = value[1:-1]  # 去掉外层单引号
                            # 转义内部单引号
                            escaped_value = inner_value.replace("'", "''")
                            values.append(f"'{escaped_value}'")
                        # 处理数字值
                        else:
                            values.append(value)
                    
                    # 构建INSERT语句
                    insert_sql = f"INSERT INTO `{table_name}` ({', '.join(columns)}) VALUES ({', '.join(values)});"
                    insert_statements.append(insert_sql)
                
                return insert_statements
            
            def process_sql_file(input_file, output_file):
                """处理SQL文件,将UPDATE转换为INSERT"""
                
                # 检查输入文件是否存在
                if not os.path.exists(input_file):
                    print(f"错误:输入文件 '{input_file}' 不存在")
                    return
                
                try:
                    # 读取输入文件
                    with open(input_file, 'r', encoding='utf-8') as f:
                        sql_content = f.read()
                    
                    # 转换UPDATE语句
                    insert_statements = update_to_insert(sql_content)
                    
                    # 写入输出文件
                    with open(output_file, 'w', encoding='utf-8') as f:
                        f.write("-- 由UPDATE语句生成的INSERT语句n")
                        f.write("-- 生成时间: 2025-09-27n")
                        f.write("-- 源文件: " + input_file + "n")
                        f.write("=" * 80 + "nn")
                        
                        for i, insert_stmt in enumerate(insert_statements, 1):
                            f.write(f"-- INSERT语句 {i}n")
                            f.write(insert_stmt + "n")
                            f.write("n")
                    
                    print(f"成功生成 {len(insert_statements)} 条INSERT语句")
                    print(f"输出文件: {output_file}")
                    
                except Exception as e:
                    print(f"处理文件时出错: {e}")
            
            def main():
                """主函数"""
                print("UPDATE语句转INSERT语句工具")
                print("=" * 40)
                
                # 输入文件路径
                input_file = input("请输入包含UPDATE语句的文件路径: ").strip()
                
                # 输出文件路径(默认在输入文件同目录下)
                if input_file:
                    base_name = os.path.splitext(input_file)[0]
                    output_file = f"{base_name}_insert.sql"
                else:
                    output_file = "output_insert.sql"
                
                # 确认输出文件路径
                custom_output = input(f"请输入输出文件路径 (默认: {output_file}): ").strip()
                if custom_output:
                    output_file = custom_output
                
                # 处理文件
                process_sql_file(input_file, output_file)
            
            # 示例使用(直接指定文件路径)
            if __name__ == "__main__":
                # 方式1:交互式输入
                # main()
                
                # 方式2:直接指定文件路径
                input_file = "./rollback_12681.sql"  # 替换为你的文件路径
                output_file = "output_insert.sql"
                process_sql_file(input_file, output_file)
            

            update_pattern = r'UPDATE `(w+)` SET (.+?) WHERE `id`=(d+);'
            

            这个正则表达式用于匹配UPDATE语句的三个关键部分:

            • (w+):匹配表名
            • (.+?):匹配SET子句内容
            • (d+):匹配WHERE条件中的id值

            set_items = re.findall(r'`(w+)`=([^,]+)(?:,|$)', set_clause)
            

            这个正则表达式用于提取SET子句中的每个字段赋值对,匹配格式为:列名=值

            代码中特别处理了三种数据类型:

            • NULL值:直接保留为NULL
            • 字符串值:去除外层单引号并转义内部单引号
            • 数字值:直接使用原值

            使用with open()语句确保文件正确打开和关闭,支持UTF-8编码以处理中文。

            运行脚本后按提示输入文件路径:

            $ python update_to_insert.py
            UPDATE语句转INSERT语句工具
            ========================================
            请输入包含UPDATE语句的文件路径: ./rollback.sql
            请输入输出文件路径 (默认: ./rollback_insert.sql): 
            成功生成 25 条INSERT语句
            输出文件: ./rollback_insert.sql
            

            修改脚本底部代码:

            if __name__ == "__main__":
                input_file = "./your_update_file.sql"
                output_file = "./output_insert.sql"
                process_sql_file(input_file, output_file)
            

            转换前(UPDATE语句):

            UPDATE `resource_detail` SET `id`=1955445664111890432, `product_name`='热轧卷', `update_time`='2025-08-23 13:37:44' WHERE `id`=1955445664111890432;
            

            转换后(INSERT语句):

            INSERT INTO `resource_detail` (`id`, `product_name`, `update_time`) VALUES (1955445664111890432, '热轧卷', '2025-08-23 13:37:44');
            

            1. 支持更多WHERE条件:当前仅支持id作为WHERE条件,可以扩展支持其他字段
            2. 批量处理:添加对目录下多个SQL文件的批量处理功能
            3. 数据库直连:添加直接连接数据库执行转换后的INSERT语句
            4. 语法检查:增加SQL语法验证功能,确保生成的INSERT语句有效
            5. 进度显示:添加进度条显示处理进度

            本文介绍的Python脚本提供了一个高效、可靠的UPDATE到INSERT语句转换解决方案。通过正则表达式和字符串处理技术,实现了SQL语句的自动转换,大大提高了数据库维护和数据处理效率。这个工具不仅适用于文中提到的场景,还可以根据具体需求进行扩展和定制。

            使用这个工具时,请注意备份原始数据,并在测试环境中验证转换结果,确保数据准确性。

            以上就是使用Python编写一个SQL语句自动转换工具(UPDATE到INSERT转换)的详细内容,更多关于Python SQL语句自动转换的资料请关注风君子博客其它相关文章!

            您可能感兴趣的文章:

            • 使用python将mysql数据库的数据转换为json数据的方法
            • Python实现把json格式转换成文本或sql文件
            • 编写Python脚本把sqlAlchemy对象转换成dict的教程
            • python3图片转换二进制存入mysql

            站内搜索