尋找兩個數據庫的差異,用於項目上線

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類
  • 包括異常、枚舉類等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章