背景: 软件系统的各个版本迭代,数据库或多或少都会有些更改,这些diff sql都必须要保存起来以便日后系统升级,多人开发的时候经常会出现遗漏或者与开发环境不一致的情况,这就导致了开发的时候系统一切正常,一到上线使用的时候出现莫名奇妙的问题。当然,官方也提供了比对两个数据差异的工具,但其不能自动忽略字段顺序的差异,以及系统中如果有默认数据也不会自动导入,所以就利用空余时间写了mysqldiff这么个工具。
mysqldiff是一个能够方便于大家在实际项目中快速生成不同版本数据库之间的差异SQL,同时还能够自动将新版中新增表中默认数据一并导入到旧版本中。
mysql虽然提供了mysqldiff工具,但实际使用中还有些不满足要求的地方,且在Linux下一般都带有python环境,所以用python写了一个。
使用时可以直接下载源码来执行mysqldiff.py,或者通过pip命令安装:
pip install mysqldiff.py
命令格式:
python mysqldiff.py [param1] [param2] { [param3]....}
参数说明:
示例:
对比db_new和db_old两个数据库中的表结构差异,并将sql语句保存到diff.sql中,同时直接执行sql语句:
python mysqldiff.py -x s=comclay:[email protected]:3306 db_new:db_old file=diff.sql
map.config
映射关系配置map.config文件中包含重命名和数据导入的配置
重命名配置用->
表示:
# 重命名
# oldtable -> newtable
# oldtable.oldcol -> newtable.newcol
# oldtable.[oldcol1, oldcol12, oldcol3 ......] -> newtable.[newcol1, newcol2, newcol3 ......]
course_old -> course
user.name -> user_new.username
数据导入配置用=>
表示:
# 数据导入
# oldtable => newtable
# oldtable.[oldcol1, oldcol12, oldcol3 ......] => newtable.[newcol1, newcol2, newcol3 ......]
course_old.[id, user_id] => user_course.[course_id, user_id]
db_old数据库中只包含user表:
db_new数据库中新增了course,并添加了一个外键约束:
使用下方命令进行差异化对比:
python mysqldiff.py -c s=comclay:[email protected]:3306 db_new:db_old
生成的diff.sql如下:
/****************************** 关闭外键约束 ******************************/
SET FOREIGN_KEY_CHECKS=0;
/****************************** course ******************************/
CREATE TABLE `course` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`course` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
`grade` int(11) DEFAULT '0',
PRIMARY KEY (`id`),
KEY `fk` (`user_id`),
CONSTRAINT `fk` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO course (grade, course, user_id, id) VALUES
(60, 'english', 1, 1);
/****************************** 开启外键约束 ******************************/
SET FOREIGN_KEY_CHECKS=1;