自動同期テーブル構造の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 つの記事で学習します。

推薦する

Windows での Nginx のインストールと環境設定 (nginx をサービスとして実行)

最初で最も重要なステップは、Windows 環境に Ngnix サービスをインストールする方法です。...

JS の FileReader を介して .txt ファイルの内容を取得する方法

目次JSはFileReaderを通じて.txtファイルの内容を取得します。 .txtファイルの読み取...

JavaScript イベント委任 (プロキシ) の使用例の詳細

目次導入例: イベントの委任記述方法1: イベント委譲書き方2: 各子要素がイベントをバインドする例...

Windows 10 で MySQL を完全に削除してアンインストールする方法

序文この記事では、Windows 10 システムで MySQL を完全に削除してアンインストールする...

vue3 における vuex と pinia の落とし穴

目次導入インストールと使用方法文章の相違点と類似点の簡単な比較VuexとPiniaの長所と短所Pin...

繰り返し送信、繰り返し更新、バックオフ防止に関する問題と解決策の分析

1つ。序文<br />この種の質問は、どの専門掲示板でも見かけます。Google で検索...

MySQL 8.0.19 インストールチュートリアル

公式サイトからインストールパッケージをダウンロードします: mysql-8.0.19-linux-g...

Vue ディレクティブ v-html と v-text

目次1. v-text テキストレンダリング命令2. v-html 1. v-text テキストレン...

CentOS システムの rpm インストールと Nginx の設定

目次CentOS rpm のインストールと Nginx の設定導入rpm パッケージのインストールサ...

MySQL 起動時に「サーバーは PID ファイルを更新せずに終了しました」というエラーが報告される理由の詳細な分析

多くの人が MySQL の起動時にこのエラーに遭遇しています。まず、このエラーの前提は、サービス ス...

MySQL 8.0.20 インストール チュートリアル (画像とテキスト付き) (Windows 64 ビット)

1: mysql公式サイトからダウンロードhttps://dev.mysql.com/downlo...

データベースの削除から逃走までの MySQL の徹底分析_上級編 (I) - データ整合性

1. データ整合性の概要1. データ整合性の概要データの冗長性とは、データベース内に重複したデータが...

MySQLのさまざまなオブジェクトのサイズと長さの制限について話しましょう

目次識別子の長さ制限権限テーブルの範囲フィールドの長さ制限データベースとテーブルの数の制限テーブルサ...

ハイパーリンクを使用してリンクファイルを開く HTML 方式の紹介

a および href 属性 HTML では、英語ではアンカーと呼ばれるハイパーリンクを表すために &...