104 lines
2.6 KiB
Markdown
104 lines
2.6 KiB
Markdown
# 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;
|
||
``` |