程序员

mysqldiff——用Python实现的一款轻量级数据库对比更

2018-12-05  本文已影响0人  Comclay

  mysqldiff是一个能够方便于大家在实际项目中快速生成不同版本数据库之间的差异SQL,同时还能够自动将新版中新增表中默认数据一并导入到旧版本中。

1. 主要功能

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

2. 使用方法

  mysqldiff.pyweb.py作为连接数据库的工具,因此在使用之前要确保环境中已经安装web.py模块,如果没有安装,可以使用下面的命令进行安装:

pip install web.py

命令格式:

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

参数说明:

示例:
对比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表:

image
db_new数据库中新增了course,并添加了一个外键约束:
image
image
使用下方命令进行差异化对比:
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;

上一篇 下一篇

猜你喜欢

热点阅读