当前位置: 首页 > news >正文

Python实现SQL语句自动转换工具(UPDATE到INSERT)

在日常数据库维护和数据处理过程中,我们经常需要将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 osdef 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_statementsdef process_sql_file(input_file, output_file):"""处理SQL文件,将UPDATE转换为INSERT"""# 检查输入文件是否存在if not os.path.exists(input_file):print(f"错误:输入文件 '{input_file}' 不存在")returntry:# 读取输入文件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-27\n")f.write("-- 源文件: " + input_file + "\n")f.write("=" * 80 + "\n\n")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)

代码解析

1. 正则表达式匹配

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

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

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

2. SET子句解析

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

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

3. 数据类型处理

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

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

4. 文件操作

使用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语句的自动转换,大大提高了数据库维护和数据处理效率。这个工具不仅适用于文中提到的场景,还可以根据具体需求进行扩展和定制。

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

http://www.dtcms.com/a/416218.html

相关文章:

  • 找网站建设公司好php制作网站
  • 建设银行网银官方网站通州企业网站建设
  • 《Python中的适配器模式实战:让第三方库优雅融入你的系统》
  • 深圳私人做网站做venn图的网站
  • 网站搭建设计 是什么中国建设银行网站首页旧版
  • 做网站vpn多大内存网站策划资料方案
  • 注册网站域名平台南通外贸建站
  • 打工人日报#20250927
  • 做网站的系统功能需求贵阳网站优化
  • 【C#】.NET开发中30秒判断该用 IEnumerable 还是 IQueryable
  • 南宁手机网站设计策划今天发生的重大新闻事件
  • 网站开发的源码html基本结构代码
  • 公司做网站需要哪些步骤俄语网站设计
  • 软件测试-性能测试⼯具篇(沉淀中)
  • 雄安专业网站建设电话室内装修效果图
  • 电子网站建设方案世界500强企业愿景
  • 回溯算法的思路总结
  • 江汉建站公司可以拿自己电脑做网站
  • 合肥做网站维护的公司专业定制网站公司
  • Docker简单学习
  • [学习日记][ssm p103以前]
  • 做网站1000以下哪家好海淀做网站设计的公司
  • 有的网站打不开 但别人电脑能打开跨境电商热销产品排行
  • 网站统计代码丹东网站推广
  • 从“链”到“图”:LangGraph如何终结LangChain的线性智能体
  • 专业的个人网站建设哪家登封网络推广
  • 东莞全网合一网站iis网站重定向设置
  • 基于STM32与influxDB的电力监控系统-4
  • c++字符串类型
  • 优化算法之梯度下降