1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        MySql之自動同步表結(jié)構(gòu)

        共 3170字,需瀏覽 7分鐘

         ·

        2021-05-27 23:32

        開發(fā)痛點

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

        解決之道

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

        原理

        同步新增的表

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

        用到的sql主要有:

        show table from rd_db;
        show create table added_table_name;

        同步表結(jié)構(gòu)

        如果rd表結(jié)構(gòu)有改動,而qa環(huán)境沒有,此程序可以直接輸出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';

        比較表結(jié)構(gòu)的代碼:

                for (Column column : sourceTable.getColumns().values()) {
        if (targetTable.getColumns().get(column.getName()) == null) {
        // 如果對應(yīng)的target沒有這個字段,直接alter
        String 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 {
        // 檢查對應(yīng)的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();
        }

        同步索引結(jié)構(gòu)

        如果rd表的索引有改變,而qa環(huán)境沒有,此程序可以直接輸出修改索引語句。原理和上面類似,在此不再贅述。

        配置

        sourceHost=127.0.0.1:3306
        sourceUser=root
        sourcePass=123123123
        sourceSchema=mystique_db
        sourceCharset=utf8

        targetHost=127.0.0.1:3306
        targetUser=root
        targetPass=123123123
        targetSchema=mystique_test
        targetCharset=utf8

        autoExecute=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

        如果打開了自動執(zhí)行,會自動執(zhí)行這些語句

        github鏈接

        https://github.com/alchemystar/Lancer

        碼云鏈接

        https://git.oschina.net/alchemystar/Lancer

        原文鏈接

        https://my.oschina.net/alchemystar/blog/858996


        瀏覽 48
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲日本韩国高清在线 | 中文字幕在线免费观看视频 | 粗大黑人巨精大战欧美成人 | 久久精品大香蕉 | 一级黄色视频免费观看 | 国产a级免费观看 | 欧美成人性爱视频 | 亚洲AV成人片色在线观看www | 国产精品永久成人免费 | 少妇又色又紧又爽又刺激视频 |