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

104 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SQL差异比较工具
## 功能描述
该工具用于比较两个由mysqldump生成的SQL文件找出表结构差异并自动生成update.sql脚本。
## 使用场景
- 同步两个数据库的结构差异
- 项目A可能是旧数据库项目B创建了新的字段和表
- 当给项目A更新服务端时确保数据库结构一致
## 工作原理
1. **读取SQL文件**:从`sql`文件夹中获取两个SQL文件
2. **解析表结构**提取每个SQL文件中的表结构信息
3. **比较差异**:找出新增的表和新增的字段
4. **生成脚本**:根据差异生成对应的`CREATE TABLE``ALTER TABLE`语句
5. **输出结果**将生成的SQL脚本保存到`out/update.sql`文件中
## 使用方法
### 1. 准备SQL文件
使用`mysqldump`命令生成两个数据库的结构文件:
```bash
# 导出旧数据库结构
mysqldump -u root -p -d old_database > sql/old.sql
# 导出新数据库结构
mysqldump -u root -p -d new_database > sql/new.sql
```
### 2. 运行脚本
```bash
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
-- 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;
```