開発の問題点開発プロセスでは、データベース フィールドが頻繁に変更されるため、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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: 複数の Tomcat を展開して起動し、プロジェクトを移行する方法を 1 つの記事で学習します。
順序なしリストでは、順序なしリストのシンボルは各リストの前に表示されるドットです。順序付きリスト o...
目次1. Angular 2 アプリケーションのライフサイクル フックとは何ですか? 2. Angu...
配列メソッドJavaScript には多くの配列メソッドが用意されています。次の図は、ほとんどの配列...
<meta http-equiv="X-UA-compatible" co...
MySQL の追加、削除、変更、クエリステートメント1. 練習シートを作成するここでの練習表は3つの...
Dockerデーモンのアクセラレータを構成する設定ファイルから Docker を起動し、/etc/d...
MySql での時間比較の実装unix_timestamp() unix_timestamp 関数は...
mysql コマンドを使用して、mysql のインストール パスを表示できます。 # 次の 2 つの...
*******************HTML言語入門(パート2)*****************...
フレックス コンテナーを作成するには、要素に display: flex プロパティを追加するだけで...
方法は2つあります: 1. サービス方法ファイアウォールのステータスを確認します。 [root@ce...
この記事では、MySQL で複数のテーブルを使用して 1 対多のクエリを使用して最新のデータを取得す...
アプリケーション ソフトウェアには通常、次のようなビジネス要件があります。新しいバージョンの APP...
1. Ubuntu Server 18.04.5 LTS システムのインストールUbuntuはデスク...
マウスをドラッグしてページのスクリーンショットを撮ります(指定した領域にスクリーンショットをドラッグ...