Skip to content

15klli/showDbStructDiffernce

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

showDbStructDiffernce

介绍

寻找两个数据库结构的不同之处,并生成对应的能保证两个数据库结构一致的sql

项目地址

用途

  1. 用于项目上线时,对比 正式服务器中的数据库测试服务器中的数据库之间的改动,以便快速、无遗漏地上线
  2. 对比两个 数据库的区别,以便发现索引、字符编码、主键变化等隐秘地方的区别

1.0版本使用说明

  1. 使用Navicat软件导出 正式服数据库 以及 测试服服务器 数据库的表结构,获得两个 sqlexport_sql

  2. 将两个文件放在src/main/resources/sqlDir

  3. 然后在 Demo类中指定相应的文件,运行即可

    1. fromFileName 为待升级的数据库sql文件,如 正式服的数据库
    2. toFileName 为想把待升级数据库 变成什么样的目标数据库sql文件,如 测试服的数据库
  4. GeneratorUtils.generate()方法返回一个SQLResult对象,

  5. SQLResult.getCanRunSqlString()返回的是可以直接运行的sql语句,这里仅含增加表格/增加字段/修改字段(不含删除) 的操作,如

/*==================【Start】创建表格语句==================*/

CREATE TABLE `t_bb_agreement_screenshot` (
 `Fid` int(11) NOT NULL AUTO_INCREMENT COMMENT '唯一ID',
 `Fagreement_oa_info_id` int(11) NOT NULL COMMENT '关联供应商ID',
 `Fimg_name` varchar(255) NOT NULL COMMENT '文件名称',
 `Fimg_type` tinyint(2) NOT NULL COMMENT '文件类型(1-发货方式合同截图 2-账期描述合同截图 3-发票类型合同截图 4-结算方式合同截图)',
 `Fimg_url` varchar(255) NOT NULL COMMENT '文件的url',
 `Fis_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '(是否删除 0 否 1 是 )',
 `Fcreate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
 `Fmodify_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
 PRIMARY KEY (`Fid`),
 KEY `tbb_supid_index` (`Fagreement_oa_info_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1239 DEFAULT CHARSET=utf8mb4 COMMENT='供应商企业凭证表,与供应商信息表通过供应商id关联';
/*==================【End】创建表格语句==================*/

/*==================【Start】以下是修改表格语句==================*/


/*--------------------【START】表格t_bb_oa_comment的修改SQL语句-----------------------*/


ALTER TABLE `t_bb_oa_comment` ADD COLUMN `Fprocess_id1` INT(11) NOT NULL   COMMENT "流程id";
ALTER TABLE `t_bb_oa_comment` MODIFY COLUMN `Fhandle_time` DATETIME NULL   COMMENT "处理时间";
ALTER TABLE `t_bb_oa_comment` ADD COLUMN `Fpayment_desc_page_num` INT(11) NULL DEFAULT NULL  COMMENT "账期描述合同页码";
ALTER TABLE `t_bb_oa_comment` MODIFY COLUMN `Fmodify_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "修改时间";

/*--------------------【END】表格t_bb_oa_comment的修改SQL语句-----------------------*/

/*==================【End】修改语句结束==================*/
  1. SQLResult.getNeedHandleSqlString()返回的是需要人工处理的sql语句,包含了会改变表结构的 删除/重命名等操作。如:

    /*--------------------分割线A开始-----------------------*/
    
    -- ----------------------------
    --  字段重命名检测:【t_bb_oa_comment】表格中的 【Fprocess_id】字段名可能改成了 【Fprocess_id1】
    --  如果不是,请运行以下语句删除旧数据列
    --  ALTER TABLE `t_bb_oa_comment` DROP COLUMN `Fprocess_id`;
    --  如果是,请运行以下语句
    -- ----------------------------
    ALTER TABLE `t_bb_oa_comment` DROP COLUMN `Fprocess_id1`;
    ALTER TABLE `t_bb_oa_comment` CHANGE COLUMN `Fprocess_id` `Fprocess_id1` INT(11) NOT NULL   COMMENT "流程id";
    
    
    /*--------------------分割线A结束-----------------------*/

注意事项

  1. 1.0 版本只支持 Navicat 导出的sql文件,导出后请不要修改,保持导出文件原封不动,以免识别有误

  2. SQLResult.getCanRunSqlString()返回的sql语句可以直接执行,但SQLResult.getNeedHandleSqlString()返回的sql语句一定要人工处理 ,否则可能会出现数据被误删

  3. 目前只支持 Innodb引擎

默认规则

  1. 表格名相同以及表格相似度超过阈值-0.8的两个超过视作同一个表格

  2. 字段名相同以及字段相似度超过阈值-0.8的两个超过视作同一个表格

阈值可以在 Constants类中进行设置。表格相似度阈值-TABLE_SAME_THRESHOLD;字段相似度阈值-ROW_SAME_THRESHOLD。相似度的计算法则在PercentCalculateUtils类中

软件架构

数据类
  • Table类:将Mysql的表格信息提取成为Table的数据

  • Row类:表格中的各个字段,有数据类型、字段名、长度等属性

  • TableIndex类:记录非主键索引信息的类

  • SQLResult类:返回生成的 sql语句予用户

    工具类
  • InitDataFromFile类:从文件中读取内容并组装 Table

  • SQLUtils类:该工具类用于以后直接从数据库读取信息初始化Table类所用

  • Generator类:生成sql的具体生成逻辑,相当于操作人,调用SqlFactory的静态方法

  • SqlFactory类:生产所有sql语句以及提示语的工厂类

  • GeneratorUtils类:与用户交互的类

  • PercentCalculateUtils类:对比两不同名的表格之间以及两个不同名的字段之间的相似度,当相似度超过相应阈值后,视作同一个表格/字段

    Common类
  • 包括异常、枚举类等

TODO

  1. 允许连接数据库直接获取Table信息,跳过导出sql文件的步骤【Finished】

  2. 优化相似度计算法则

  3. 优化:使用正则表达式在处理之前筛选不支持的文件

  4. 优化:错误提示

联系我

LICENSE

  • BSD

致谢

  • 在此感谢我的女朋友从毕业至此的陪伴。就把这个作为生日礼物之一送给她吧。如果此工具对你有帮助,可以扫码转账 0.01 元给她,备注上 野猪祝你生日快乐!,非常感谢! ercode

About

The Tool to find & show the difference of two mysql databases

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published