Files
diffSQL/README.md
2026-01-05 15:13:55 +08:00

2.6 KiB
Raw Permalink Blame History

SQL差异比较工具

功能描述

该工具用于比较两个由mysqldump生成的SQL文件找出表结构差异并自动生成update.sql脚本。

使用场景

  • 同步两个数据库的结构差异
  • 项目A可能是旧数据库项目B创建了新的字段和表
  • 当给项目A更新服务端时确保数据库结构一致

工作原理

  1. 读取SQL文件:从sql文件夹中获取两个SQL文件
  2. 解析表结构提取每个SQL文件中的表结构信息
  3. 比较差异:找出新增的表和新增的字段
  4. 生成脚本:根据差异生成对应的CREATE TABLEALTER TABLE语句
  5. 输出结果将生成的SQL脚本保存到out/update.sql文件中

使用方法

1. 准备SQL文件

使用mysqldump命令生成两个数据库的结构文件:

# 导出旧数据库结构
mysqldump -u root -p -d old_database > sql/old.sql

# 导出新数据库结构
mysqldump -u root -p -d new_database > sql/new.sql

2. 运行脚本

python sql_diff.py

3. 查看结果

生成的update.sql文件将保存在out文件夹中,包含:

  • 新增表的CREATE TABLE语句
  • 新增字段的ALTER TABLE语句

项目结构

sql_utils/
├── sql/              # 存放待比较的SQL文件
├── out/              # 存放生成的update.sql文件
├── sql_diff.py       # 主程序文件
└── README.md         # 项目说明文档

代码说明

主要函数

  1. get_sql_files()获取sql文件夹中的SQL文件
  2. parse_sql_file(file_path)解析SQL文件提取表结构信息
  3. compare_tables(old_tables, new_tables):比较两个表结构字典,找出差异
  4. generate_update_sql(old_file, new_file, diff)根据差异生成update.sql语句
  5. main():主函数,协调各个步骤

依赖

  • Python 3.x
  • 标准库os, re, datetime

注意事项

  1. 确保sql文件夹中只有两个SQL文件
  2. 建议使用文件名中的old关键字标识旧数据库文件,方便程序自动识别
  3. 该工具仅比较表结构,不比较数据
  4. 生成的SQL脚本需要人工审核后再执行

示例

输入

sql/old.sql(旧数据库结构) sql/new.sql(新数据库结构)

输出

-- SQL差异更新脚本
-- 生成时间: 2023-01-01 12:00:00
-- 比较文件: old.sql (旧) -> new.sql (新)

-- 新增表

CREATE TABLE `new_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 新增字段

ALTER TABLE `existing_table` ADD COLUMN `new_field` varchar(255) DEFAULT NULL;