寻找两个数据库结构的不同之处,并生成对应的能保证两个数据库结构一致的sql
- 用于项目上线时,对比 正式服务器中的数据库 与 测试服务器中的数据库之间的改动,以便快速、无遗漏地上线
- 对比两个 数据库的区别,以便发现索引、字符编码、主键变化等隐秘地方的区别
-
将两个文件放在
src/main/resources/sqlDir下 -
然后在
Demo类中指定相应的文件,运行即可fromFileName为待升级的数据库sql文件,如 正式服的数据库toFileName为想把待升级数据库 变成什么样的目标数据库sql文件,如 测试服的数据库
-
GeneratorUtils.generate()方法返回一个SQLResult对象, -
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】修改语句结束==================*/-
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.0版本只支持Navicat导出的sql文件,导出后请不要修改,保持导出文件原封不动,以免识别有误 -
SQLResult.getCanRunSqlString()返回的sql语句可以直接执行,但SQLResult.getNeedHandleSqlString()返回的sql语句一定要人工处理 ,否则可能会出现数据被误删 -
目前只支持
Innodb引擎
-
表格名相同以及表格相似度超过阈值-0.8的两个超过视作同一个表格
-
字段名相同以及字段相似度超过阈值-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类:对比两不同名的表格之间以及两个不同名的字段之间的相似度,当相似度超过相应阈值后,视作同一个表格/字段 -
包括异常、枚举类等
-
允许连接数据库直接获取Table信息,跳过导出【Finished】sql文件的步骤 -
优化相似度计算法则
-
优化:使用正则表达式在处理之前筛选不支持的文件
-
优化:错误提示
- Email: 852778163@qq.com
- BSD