日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MySql之自动同步表结构

發布時間:2025/3/18 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySql之自动同步表结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MySql之自動同步表結構

開發痛點

在開發過程中,由于頻繁的修改數據庫的字段,導致rd和qa環境的數據庫表經常不一致。
而由于這些修改數據庫的操作可能由多個rd操作,很難一次性收集全。人手工去和qa環境對字段又特別繁瑣,容易遺漏。

解決之道

于是筆者就寫了一個能夠自動比較兩個數據庫的表結構,并生成alter語句的程序。同時還可以進行配置從而自動這行這些alter語句。詳情見github

原理

同步新增的表

如果rd環境新增的表,而qa環境沒有,此程序可以直接輸出create table語句。原理如下:

用到的sql主要有:

show table from rd_db; show create table added_table_name;

同步表結構

如果rd表結構有改動,而qa環境沒有,此程序可以直接輸出alter語句,原理如下:

用到的sql有:

select COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,COLUMN_COMMENT,EXTRA from information_schema.columns where TABLE_SCHEMA='rd_db'and TABLE_NAME = 'rd_table';

比較表結構的代碼:

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打開,找到

alchemystar.runner.ShellRunner

運行其中的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之自动同步表结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。