自動同期テーブル構造のMySql開発

自動同期テーブル構造のMySql開発

開発の問題点

開発プロセスでは、データベース フィールドが頻繁に変更されるため、RD 環境と QA 環境のデータベース テーブルに不整合が生じることがよくあります。

ただし、これらのデータベース変更操作は複数の RD によって実行される可能性があるため、すべてを一度に収集することは困難です。 QA 環境でフィールドを手動でチェックするのは非常に面倒であり、見逃してしまう可能性も高くなります。

解決

そこで、2 つのデータベースのテーブル構造を自動的に比較し、ALTER ステートメントを生成できるプログラムを作成しました。これらの変更ステートメントを自動的に実行するように構成することもできます。詳細はgithubをご覧ください

原理

新しく追加されたテーブルを同期する

rd 環境に新しいテーブルが追加され、qa 環境に追加されていない場合、このプログラムは直接 create table ステートメントを出力できます。仕組みは次のとおりです:

主に使用される SQL は次のとおりです。

rd_db からテーブルを表示します。
テーブルadded_table_nameを作成します。

同期テーブルの構造

rd テーブル構造が変更されているが、qa 環境が変更されていない場合、このプログラムは alter ステートメントを直接出力できます。原理は次のとおりです。

使用されるSQLは次のとおりです。

選択 
 列名、列タイプ、IS_NULLABLE、列デフォルト、列コメント、追加 
から 
 情報スキーマ列
どこ 
  TABLE_SCHEMA='rd_db'
  TABLE_NAME = 'rd_table';

テーブル構造を比較するためのコード:

        for (列 column : sourceTable.getColumns().values()) {
            targetTable.getColumns().get(column.getName()) == nullの場合{
                // 対応するターゲットにこのフィールドがない場合は、直接変更します
                文字列 sql = "alter table " + target.getSchema() + "." + targetTable.getTableName() + "add " + 列
                        .getName() + " ";
                sql += 列.getType() + " ";
                (column.getIsNull().equals("NO"))の場合{
                    sql + = "NULLではありません";
                } それ以外 {
                    sql + = "NULL";
                }
                (column.getDefaultValue() != null)の場合{
                    sql += "DEFAULT " + SqlUtil.getDbString(column.getDefaultValue()) + " ";
                }
                (column.getComment() != null)の場合{
                    sql += "コメント " + SqlUtil.getDbString(column.getComment()) + " ";
                }
                if (after != null) {
                    sql += "後" + 後;
                }
                changeSql.add(sql+";");
            } それ以外 {
                // 対応するソース属性とターゲット属性をチェックする String sql =
                        "テーブルを変更" + target.getSchema() + "." + targetTable.getTableName() + "変更" + 列
                                .getName() + " ";
                列ソースColumn = column;
                列 targetColumn = targetTable.getColumns().get(sourceColumn.getName());
                // 2 つのフィールドを比較します。null が返された場合は、一貫性があることを示します。String sqlExtend = compareSingleColumn(sourceColumn, targetColumn);
                (sqlExtend != null)の場合{
                    changeSql.add(sql + sqlExtend+";");
                }
            }
            after = 列.getName();
        }

インデックス構造を同期する

rd テーブルのインデックスが変更されたが、qa 環境が変更されていない場合、このプログラムは変更インデックスステートメントを直接出力できます。原理は上記と同様なので、ここでは繰り返しません。

構成

ソースホスト=127.0.0.1:3306
ソースユーザー=ルート
ソースパス=123123123
ソーススキーマ=mystique_db
ソースCharset=utf8

ターゲットホスト=127.0.0.1:3306
ターゲットユーザー=ルート
ターゲットパス=123123123
ターゲットスキーマ=mystique_test
ターゲット文字セット=utf8

autoExecute=YES //これは自動同期を示します

走る

上記のテンプレートに従って設定し、IDEで開きます。

alchemystar.runner.ShellRunner 

メインメソッドを実行するだけです

生成されたエフェクトの表示

mystique_test.t_test_3 テーブルを変更し、ID id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '' を変更します
mystique_test.t_test_3 テーブルを変更し、インデックス (名前) を追加します。
テーブル mystique_test.t_test_3 を変更し、インデックス name_id を削除します。
テーブル mystique_test.t_test_3 を変更し、名前の後に id_2 varchar(50) NULL DEFAULT '' COMMENT '' を追加します。

自動実行がオンになっている場合、これらのステートメントは自動的に実行されます

githubリンク

https://github.com/alchemystar/ランサー

コードクラウドリンク

https://git.oschina.net/alchemystar/ランサー

要約する

これで、MySql 開発とテーブル構造の自動同期に関するこの記事は終了です。MySql テーブル構造の自動同期に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLは2つのテーブル間のデータの同期を実現します
  • MySQL 5.7 における部分テーブルのデュアルマスター同期の実装プロセスの詳細な説明

<<:  HTMLを教える記事

>>:  複数の Tomcat を展開して起動し、プロジェクトを移行する方法を 1 つの記事で学習します。

推薦する

Apache の一般的な仮想ホスト設定方法の分析

1. Apacheサーバーのインストールと設定yum インストール httpd -y systemc...

CSSの4種類の配置の違いの詳細な説明

フロントエンド開発でよく使われるCSSの配置方法は、位置決めには、通常位置決め、相対位置決め、絶対位...

Linux で rpm パッケージを見つけるために CD をマウントする方法

前面に書かれたLinux を使用する際にソフトウェアをインストールする必要がある場合があります。もち...

mysql での rpm インストールの詳細な説明

インストールとアンインストールの表示 # rpm -qa | grep mysql を表示 # アン...

MySQLへのJava接続の基礎となるカプセル化の詳細な説明

この記事では、Java接続MySQLの基礎となるカプセル化コードを参考までに紹介します。具体的な内容...

HTML でフレームセット タグを使用するチュートリアル

フレームセット ページは通常の Web ページとは多少異なります。依然として <HTML>...

MySQL のデータベース パフォーマンスに影響を与える要因の説明

データベースのパフォーマンスに関する話面接では、「データベースにどのくらい精通していますか?」など、...

Docker データボリュームコンテナの作成と使用状況分析

データ ボリューム コンテナーは、データ ボリュームをマウントするために特別に使用されるコンテナーで...

JavaScript の一般的なステートメント ループ、判定、文字列から数値

目次1. スイッチ2. whileループ3. Do/Whileループ3. 文字列を数値に変換する1....

JavaScript を使って簡単な計算機を書く

効果は以下のとおりです。参考プログラム: <!DOCTYPE html> <htm...

Vue Routerはバックグラウンドデータに応じて異なるコンポーネントをロードします

目次実際のプロジェクトで遭遇する要件実装が間違っているところもある私は個人的に、実装するより良い方法...

React-Native スクリーンショットコンポーネント react-native-view-shot の紹介と使い方のまとめ

目次1. 現象2. 解決策3. 要約: 1. 現象1. 要件: 特定の表示ページをキャプチャしてアル...

Linux のスケジュールタスク Crontab コマンドの使用に関する詳細な説明と概要

crontab コマンドは、Unix および Linux で定期的な実行命令を設定するために使用され...

Linux で MySQL データベースのスケジュールされたバックアップを実装する簡単な方法

詳細な手順は次のとおりです。 1. ディスク容量を確認します。 [root@localhost バッ...

HTML およびプラグイン アプリケーションにおけるデータ カスタム属性の使用の概要

HTML にはデータ属性が含まれていることがよくあります。これらは HTML5 のカスタム属性です。...