一、需求來源
來源,其實也是自己開發的時候用到的。哈哈,公司交代了一個項目給我全權處理,也就是說我要設計數據庫,寫接口文檔,參與開發,分配任務等等。
身邊的開發人員項目經驗比較少,於是我就上去主導項目了。后面帶領團隊一兩周,到了測試環境預備的階段。此時,我的數據庫還沒有完全設計完成。於是,我就把開發的數據庫腳本導出到測試環境的數據庫。
這樣一來,問題就出來了。我如果修改了開發環境的表結構,還得同步測試環境。本來覺得手多操作一遍是可以的,但是人終究會犯錯的。偶爾,修改開發表結構的時候,被其他事情打斷了,我就忘記同步到測試環境。久而久之,兩邊的表結構就產生了很大的差異。全部清空吧,一百來張表,說多不多,說少也不少。
於是,我萌生了一種自己寫一個跨庫表比較工具的念頭。
二、設計思路
1、獲取數據庫A和數據庫B的所有表信息。
2、先進行表數量的比較 -> 獲取出數據庫A比數據庫B少的表,數據庫B比數據庫A少的表。
3、遍歷數據庫A的每個表信息,獲取每個表的字段信息
4、遍歷數據庫B的每個表信息,獲取每個表的字段信息
5、進行字段數量的比較 -> 獲取出數據庫A的表比數據庫B的表少的字段,數據庫B的表比數據庫A的表少的字段。
6、進行字段的詳細比較 -> 獲取出數據庫A的表比數據庫B的表字段不一樣的比較(比如類型、索引、比較規則、字符格式、數字精度、注釋等等),數據庫B的表比數據庫A的表字段不一樣的比較
問題1:如何獲取數據庫下的所有表信息
回答:可以通過show tables;獲取
問題2:如何獲取表的所有字段信息
回答: a.通過show create table [表名];可以獲取建表語句,不好處理,不滿足我的需求。
b.通過desc [表名];可以獲取表結構的一些基本信息,但無法獲取字段的注釋等更詳細的信息,不滿足我的需求。
c.通過select * from information_schema.COLUMNS where TABLE_SCHEMA = [庫名] and TABLE_NAME = [表名];這個可以獲取到比較完整的信息,滿足條件。
我就采用c這種方案了。
剩下的就是集合之間的比較問題了,比較簡單就不說了。
三、源碼地址
https://github.com/telephone6/java-collection.git
位於項目的database/mysql-compare模塊,修改屬性后,運行cn.lxw.mysql.MainApp的main函數即可看到效果。
大家可以關注一下這個倉庫,我會不定期傳遞一些有意思的代碼到上面。
四、心得體會
整個思路+實現花費了2個小時的時間,感覺還是值得的吧。畢竟解決了自己的一些問題,心理還是有一點點成就感的,現在看數據庫之間的差異就沒有那么辛苦了。雖然打印出來是有一點丑,大家可以下載一下自己改良使用。
最后來一句:成就感,讓寫代碼不再那么枯燥。
謝謝大家觀看!