mysqldiff——用Python实现的一款轻量级数据库对比工具,同时支持新增表的默认数据导入!

  背景: 软件系统的各个版本迭代,数据库或多或少都会有些更改,这些diff sql都必须要保存起来以便日后系统升级,多人开发的时候经常会出现遗漏或者与开发环境不一致的情况,这就导致了开发的时候系统一切正常,一到上线使用的时候出现莫名奇妙的问题。当然,官方也提供了比对两个数据差异的工具,但其不能自动忽略字段顺序的差异,以及系统中如果有默认数据也不会自动导入,所以就利用空余时间写了mysqldiff这么个工具。
  mysqldiff是一个能够方便于大家在实际项目中快速生成不同版本数据库之间的差异SQL,同时还能够自动将新版中新增表中默认数据一并导入到旧版本中。

1. 主要功能

mysql虽然提供了mysqldiff工具,但实际使用中还有些不满足要求的地方,且在Linux下一般都带有python环境,所以用python写了一个。

  • 比对两个数据库的差异;
  • 比对两张表的差异;
  • 支持外键的处理;
  • 自动忽略表字段的顺序差异;
  • 支持表或列的重命名;
  • 支持同步新增表中数据;
  • 支持旧表中的数据导入到新增表中;
  • 将生成的差异sql保存到文件或者自动执行;
  • 记录错误日志,出错时方便排查。

2. 使用方法

  使用时可以直接下载源码来执行mysqldiff.py,或者通过pip命令安装:

pip install mysqldiff.py

命令格式:

 python mysqldiff.py [param1] [param2] { [param3]....}

参数说明:

  • -x
    自动执行差异SQL语句,默认不执行。
  • -c
    是否插入新增表中的默认数据
  • s=[user]:[pass]@[host]:[port]
    当两个数据库的连接配置相同时可以用该参数,否则用下面的sn和so分别指明。
    user:用户名
    pass:密码
    host:ip地址
    port:端口
  • so=[user]:[pass]@[host]:[port]
    数据库配置。
  • sn=[user]:[pass]@[host]:[port]
    被参照的数据库配置。
  • [db_new]{.[table_name]}:[db_old]{.[table_name]}
    数据库名.表名,不指名表名时对比整个数据库。
  • file=[diff_file]
    差异化sql保存位置,默认保存在diff.sql文件中。

示例:
对比db_new和db_old两个数据库中的表结构差异,并将sql语句保存到diff.sql中,同时直接执行sql语句:

python mysqldiff.py -x s=comclay:123456@192.168.16.122:3306 db_new:db_old file=diff.sql

3. 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]

4. 数据库对比

db_old数据库中只包含user表:
db_new数据库中新增了course,并添加了一个外键约束:

使用下方命令进行差异化对比:

python mysqldiff.py -c s=comclay:123456@192.168.18.149: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;

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值