一个用Rust编写的MySQL数据库结构对比工具,用于比较两个MySQL数据库的表结构差异并生成ALTER SQL语句。
- 🔍 数据库结构对比: 对比两个MySQL数据库的表定义
- 📄 SQL文件对比: 支持对SQL文件中的表结构进行对比
- 🛠️ 自动生成ALTER语句: 自动生成从目标数据库迁移到源数据库的ALTER语句
- 📊 详细的差异分析:
- 列定义变更(添加、修改、删除)
- 约束变更(主键、唯一键、普通索引、全文索引、外键)
- 表选项变更(引擎、字符集)
- Rust 1.70 或更高版本
- MySQL 5.7+ 或 MariaDB(当使用数据库模式时)
cargo build --release编译完成后,可执行文件位于 target/release/mysql_compare
mysql_compare -d <data_source> -s <source> -t <target> -o <output>| 参数 | 简写 | 说明 | 必需 |
|---|---|---|---|
--data |
-d |
数据源类型,可选值:file (SQL文件) 或 db (数据库连接) |
✓ |
--source |
-s |
源数据库/文件路径 | ✓ |
--target |
-t |
目标数据库/文件路径 | ✓ |
--output |
-o |
输出SQL文件路径 | ✓ |
mysql_compare -d file -s source.sql -t target.sql -o diff.sqlmysql_compare -d db -s user:password@localhost:3306~source_db -t target.sql -o diff.sqlmysql_compare -d db \
-s user:password@localhost:3306~source_db \
-t user:password@localhost:3306~target_db \
-o diff.sql当使用 -d db 时,连接字符串格式为:
user:password@host:port~database_name
示例:
root:123456@192.168.1.100:3306~mydb
生成的SQL文件示例:
-- set default character
SET NAMES utf8;
-- users
ALTER TABLE `users`
ADD COLUMN `email` varchar(255) NOT NULL,
MODIFY COLUMN `name` varchar(100) NOT NULL,
DROP COLUMN `old_field`,
ADD UNIQUE INDEX `email_idx` (`email`);
-- products
CREATE TABLE `products` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`price` decimal(10,2) NOT NULL,
PRIMARY KEY (`id`),
KEY `name_idx` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;mysql_compare/
├── Cargo.toml # 项目配置文件
├── Cargo.lock # 依赖锁定文件
├── README.md # 本文件
└── src/
└── main.rs # 项目主文件
- mysql: MySQL数据库连接和操作库
- clap: 命令行参数解析
- anyhow: 错误处理
- regex: 正则表达式处理
-
数据源读取:
- 从数据库连接或SQL文件中读取表定义
- 支持多个表的并发读取
-
结构解析:
- 使用正则表达式解析CREATE TABLE语句
- 提取列定义、约束、表选项等信息
-
差异对比:
- 逐表进行结构对比
- 识别列、约束、选项的变更
-
SQL生成:
- 生成对应的ALTER TABLE语句
- 处理缺失表(DROP)和新增表(CREATE)
- 目前仅支持InnoDB引擎
- 对于复杂的列类型定义,解析可能需要优化
- 暂不支持视图、存储过程等高级对象的对比
检查数据库连接参数是否正确:
user:password@host:port~database
如遇到SQL解析问题,请检查:
- SQL文件编码是否为UTF-8
- CREATE TABLE语句是否规范
cargo testcargo buildMIT
欢迎提交Issue和Pull Request!
- 修复了表定义解析的正则表达式
- 改进了约束对比逻辑
- 优化了SQL生成格式
如有问题或建议,请提交Issue。