MySql之自动同步表结构
生活随笔
收集整理的這篇文章主要介紹了
MySql之自动同步表结构
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
MySql之自動同步表結構
開發痛點
在開發過程中,由于頻繁的修改數據庫的字段,導致rd和qa環境的數據庫表經常不一致。
而由于這些修改數據庫的操作可能由多個rd操作,很難一次性收集全。人手工去和qa環境對字段又特別繁瑣,容易遺漏。
解決之道
于是筆者就寫了一個能夠自動比較兩個數據庫的表結構,并生成alter語句的程序。同時還可以進行配置從而自動這行這些alter語句。詳情見github
原理
同步新增的表
如果rd環境新增的表,而qa環境沒有,此程序可以直接輸出create table語句。原理如下:
用到的sql主要有:
同步表結構
如果rd表結構有改動,而qa環境沒有,此程序可以直接輸出alter語句,原理如下:
用到的sql有:
比較表結構的代碼:
for (Column column : sourceTable.getColumns().values()) {if (targetTable.getColumns().get(column.getName()) == null) {// 如果對應的target沒有這個字段,直接alterString sql = "alter table " + target.getSchema() + "." + targetTable.getTableName() + " add " + column.getName() + " ";sql += column.getType() + " ";if (column.getIsNull().equals("NO")) {sql += "NOT NULL ";} else {sql += "NULL ";}if (column.getDefaultValue() != null) {sql += "DEFAULT " + SqlUtil.getDbString(column.getDefaultValue()) + " ";}if (column.getComment() != null) {sql += "COMMENT " + SqlUtil.getDbString(column.getComment()) + " ";}if (after != null) {sql += "after " + after;}changeSql.add(sql+";");} else {// 檢查對應的source 和 target的屬性String sql ="alter table " + target.getSchema() + "." + targetTable.getTableName() + " change " + column.getName() + " ";Column sourceColumn = column;Column targetColumn = targetTable.getColumns().get(sourceColumn.getName());// 比較兩者字段,如果返回null,表明一致String sqlExtend = compareSingleColumn(sourceColumn, targetColumn);if (sqlExtend != null) {changeSql.add(sql + sqlExtend+";");}}after = column.getName();}同步索引結構
如果rd表的索引有改變,而qa環境沒有,此程序可以直接輸出修改索引語句。原理和上面類似,在此不再贅述。
配置
sourceHost=127.0.0.1:3306 sourceUser=root sourcePass=123123123 sourceSchema=mystique_db sourceCharset=utf8targetHost=127.0.0.1:3306 targetUser=root targetPass=123123123 targetSchema=mystique_test targetCharset=utf8autoExecute=YES //此處表明自動同步運行
按照上面的模板進行配置
用IDE打開,找到
運行其中的main方法即可
生成效果展示
alter table mystique_test.t_test_3 change id id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '' alter table mystique_test.t_test_3 add index (name) alter table mystique_test.t_test_3 drop index name_id alter table mystique_test.t_test_3 add id_2 varchar(50) NULL DEFAULT '' COMMENT '' after name如果打開了自動執行,會自動執行這些語句
github鏈接
https://github.com/alchemystar/Lancer
碼云鏈接
https://git.oschina.net/alchemystar/Lancer
原文鏈接
https://my.oschina.net/alchemystar/blog/858996
總結
以上是生活随笔為你收集整理的MySql之自动同步表结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Git无法检测到文件名大小写的更改
- 下一篇: Java中ListE对象赋值问题(引用传