showDbStructDiffernce
介紹
尋找兩個數據庫結構的不同之處,並生成對應的能保證兩個數據庫結構一致的sql
項目地址
用途
- 用於項目上線時,對比 正式服務器中的數據庫 與 測試服務器中的數據庫之間的改動,以便快速、無遺漏地上線
- 對比兩個 數據庫的區別,以便發現索引、字符編碼、主鍵變化等隱祕地方的區別
1.0版本使用說明
-
使用
Navicat
軟件導出 正式服數據庫 以及 測試服服務器 數據庫的表結構,獲得兩個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
類:對比兩不同名的表格之間以及兩個不同名的字段之間的相似度,當相似度超過相應閾值後,視作同一個表格/字段Common類
-
包括異常、枚舉類等