Flyway を使用して Java でデータベースのバージョン変更を管理する方法

1 はじめに

	随着项目的不断迭代,数据库表结构、数据都在发生着变化。甚至有的业务在多环境版本并行运行。数据为王的时代,管理好数据库的版本也成为了迫切的需要。如何能做到像 Git 之类的版本控制工具来管理数据库?Java 项目中常用 Flyway 和 Liquibase 来管理数据库版本。其中 Flyway 相对来说比较受欢迎。

2. フライウェイの特徴

Flyway が人気がある理由は、次のような利点があります。

  • シンプルでインストールと学習が非常に簡単で、移行方法も開発者に受け入れられやすいです。
  • D dedicated Flyway は、他の副作用を伴わないデータベースの移行とバージョン管理に重点を置いています。
  • Powerful は継続的な配信向けに設計されています。アプリケーションの起動時に Flyway にデータベースを移行させます。

3. フライウェイの動作メカニズム

Flyway は、最初に DB 内にメタデータ テーブルを作成する必要があります (デフォルトのテーブル名は flyway_schema_history です)。このテーブルには各移行 (移行) レコードが保存され、レコードには移行スクリプトのバージョン番号と SQL スクリプトのチェックサム値が含まれます。 。次の図は、複数のデータベース バージョンを表しています。
ここに画像の説明を挿入
対応するメタデータ テーブル レコード:
ここに画像の説明を挿入

Flyway は、ファイル システムまたはアプリケーションのクラスパスをスキャンして、移行用の DDL および DML を読み取ります。メタデータ テーブルに対して移行を確認します。スクリプトが、最新としてマークされたバージョン番号の 1 つ以下のバージョン番号を宣言した場合、それらは無視されます。残りの移行は保留中の移行です。利用可能ですが、適用されていません。最後にバージョン番号でソートして順番に実行し、実行結果をメタデータテーブルに書き込みます。

ここに画像の説明を挿入
対応するメタデータ テーブル レコード:

ここに画像の説明を挿入
Flyway はコマンド ライン (コマンド ライン ツールをダウンロードする必要があります) と Java API をサポートし、ビルド ツール Maven と Gradle もサポートします。ここでは Java API に焦点を当てます。

4. フライウェイのルール

Flyway は 2 つの SQL ファイルのシーケンスをどのように比較しますか? 左揃えの原理を採用しており、空席は0に置き換えられます。いくつかの例を挙げると、次のようになります。

1.0.1.1 は 1.0.1 より新しいバージョンです。

1.0.10 は 1.0.9.4 よりも新しいバージョンです。

1.0.10 は 1.0.010 と同じバージョン番号であり、各バージョン番号部分の先頭の 0 は無視されます。

Flyway は SQL ファイルを次の 3 つのタイプに分類します: バージョン付き、反復可能、および元に戻す:

バージョン管理はバージョンのアップグレードに使用されます。各バージョンには一意のバージョン番号があり、一度だけ実行できます。
反復可能は繰り返し実行できます。反復可能 SQL スクリプトのチェックサムが変更されたことを Flyway が検出すると、Flyway はスクリプトを再適用します。バージョン更新の場合、このタイプの移行は常に Versioned の実行後に実行されます。
「元に戻す」は、同じバージョンでのバージョン管理された移行の影響を元に戻すために使用されます。ただし、ロールバックはあまりにも大まかで機械的すぎるため、一般的にはお勧めできません。通常、解決するにはバージョン対応モードを使用することをお勧めします。
これら 3 つの命名規則は次のとおりです。
ここに画像の説明を挿入

  • プレフィックスは構成可能、プレフィックス識別、デフォルト値 V はバージョン管理を意味し、R は反復可能を意味し、U は元に戻すことを意味します
  • バージョンは、1 つ以上の数字で構成されるバージョン番号を識別し、数字の間の区切り文字はドットまたはアンダースコア _ です。
  • 区切り文字は構成可能で、バージョン識別情報と説明情報を区切るために使用されます。デフォルトは 2 つのアンダースコアです__
  • 説明 説明情報、テキストはアンダースコア_またはスペースで区切ることができます
  • サフィックスは構成可能、フォローアップ識別子、デフォルトは .sql

4. Spring Boot は Flyway を統合します

Spring Boot は Flyway の自動構成を提供します。すぐにデータベースのバージョン管理に Flyway を使用できるようになります。

4.1 フライウェイの依存関係

依存関係をインポートするだけです。

org.flywaydb フライウェイコア

構成を直感的に説明するために、まず Spring Boot 構成ファイル application.yml で H2 データベースを次のように構成します。

spring: datasource: # h3 driver driver-class-name: org.h3.Driver # h3 データベースはディスク D:/h3 に永続化されます ライブラリ名: flyway mysql モード url: jdbc:h3:file:D:/h3/flyway; MODE=MySQL;DATABASE_TO_LOWER=TRUE h3: # コンソール アクセスを有効にするデフォルト false console: Enabled: true settings: # デバッグを容易にするために h3 コンソール トラッキングを有効にするデフォルト false トレース: true # コンソール リモート アクセスを許可するデフォルト false web-allow-others: true # h3 アクセスパスコンテキストパス: /h3-console

もちろん、リレーショナル データベース環境を統合する必要があります。ここでは H2 データベースを使用して説明しますが、他のデータベースも方言が異なることを除けば同じです。H2 データベースに詳しくない方は、私の特別記事 Spring Boot 2 戦闘: H2 データベースの統合と使用を参照してください。

4.2 フライウェイ構成

構成を直感的に説明するために、まず Spring Boot 構成ファイル application.yml で H2 データベースを次のように構成します。

spring: datasource: # h3 driver driver-class-name: org.h3.Driver # h3 データベースはディスク D:/h3 に永続化されます ライブラリ名: flyway mysql モード url: jdbc:h3:file:D:/h3/flyway; MODE=MySQL;DATABASE_TO_LOWER=TRUE h3: # コンソール アクセスを有効にするデフォルト false console: Enabled: true settings: # デバッグを容易にするために h3 コンソール トラッキングを有効にするデフォルト false トレース: true # コンソール リモート アクセスを許可するデフォルト false web-allow-others: true # h3
Flyway に対応するアクセス パス コンテキスト パス: /h3-console の構成は次のとおりです。

flyway 設定 spring: flyway: # flyway を有効または無効にします Enabled: true # flyway の clean コマンドは、指定されたスキーマの下にあるすべてのテーブルを削除するため、本番環境は無効にする必要があります。デフォルト値は false ですが、これはデフォルト設定としては理論的に非科学的です。clean-disabled: true # SQL スクリプト ディレクトリ、カンマで区切られた複数のパス デフォルト値 classpath:db/migration location: classpath:db/migration # メタデータ バージョン管理情報テーブル デフォルト flyway_schema_history table: flyway_schema_history # flyway_schema_history メタデータ テーブルがない場合、Before flyway 移行コマンドを実行するには、まず flyway ベースライン コマンドを実行する必要があります。 # これを true に設定すると、ベースラインが必要なときに flyway が自動的にベースラインを実行します。Baseline-on-Migrate: true # ベースラインのバージョン番号を指定します。デフォルト値は 1 です。このバージョン番号よりも古い SQL ファイルは移行時に無視されます Baseline-version: 1 # デフォルトの文字エンコーディングは UTF-8 エンコーディングです。 UTF-8 # アウトオブオーダー移行を許可するかどうか 開発提案 true プロダクション提案 false out-of-order: false # flyway によって制御されるスキーマ リストが必要です。ここでは、flyway のデフォルトとして構成し、spring によって構成されたスキーマを使用します。 datasource.url, # Yes 複数のスキーマを指定しますが、最初のスキーマの下にメタデータ テーブルのみを作成し、最初のスキーマに移行 SQL スクリプトのみを適用します。 # ただし、flyway Clean コマンドはこれらのスキーマで順番に実行されます。
Flyway 関連の設定手順を必ずよく読んでください。

4.3 SQL初期化スクリプトの作成

まず初期化 SQL ファイルを作成し、H2 データベースで自動的に初期化されたスキーマ フライウェイに sys_user テーブルを追加します。命名規則に注意してください。スクリプト名は V1.0.1__Add_table_user.sql です。SQL スクリプトの場所は spring.flyway.locations で構成されます。内容は次のとおりです。

use flyway; CREATE TABLE sys_user( user_idint(10) unsigned NOT NULL AUTO_INCREMENT, usernamevarchar(1024) NOT NULL unique , encode_passwordvarchar(1024) NOT NULL, ageint(3) NOT NULL, PRIMARY KEY ( user_id) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4; insert into flyway.sys_uservalues (1,'Felordcn','{noop}12345',18);
Spring Boot アプリケーションを開始します。H2 データベース コンソール http://localhost:8080/h3-console を開き、「jdbc:h3:file:D:/h3/flyway;MODE=MySQL;DATABASE_TO_LOWER=TRUE」を JDBC URL 列に貼り付け、「接続」ボタンをクリックして入力します。次のインターフェース:

Flyway を使用して Java でデータベースのバージョン変更を管理する方法

ここで -1 は、Flyway に必要な flyway_schema_history テーブルをデフォルトにしているためです。0 は、H2 データベースがスキーマ フライウェイを自動的に初期化し、他のデータベースでは手動で作成する必要がある場合があるためです。

4.4 SQL変更スクリプトの作成

V1.0.0__Delete_sysuser_felordcn.sql を作成して、V1.0.1__Add_table_user.sql で初期化されたユーザーを削除します。検証を有効にしているため、起動エラーが報告されていることがわかります。そのため、ロジック エラーのあるバージョンに対して例外がスローされます。バージョン番号を V1.0.2__Delete_sysuser_felordcn.sql に変更して、再度開始します。H2 データベース コンソールを通じて、追加の変更レコードが見つかります。

Flyway を使用して Java でデータベースのバージョン変更を管理する方法

同時に、予想どおり、sys_user テーブル内のデータが失われます。

5. フライウェイのベストプラクティス

上記の紹介により、すぐにデータベースのバージョン管理に Flyway を使用するようになると思います。実際の開発におけるいくつかの経験の要約は次のとおりです。

本番環境では spring.flyway.cleanDisabled=false を無効にする必要があります。
元に戻すモードの使用は避けてください。
開発バージョン番号は、混乱を避けるために、できる限りチームに応じた名前を付ける必要があります。たとえば、V1.0.1__ProjectName_{Feature|fix}_Developer_Description.sql のように指定すると、スクリプトと関連関数の開発者に関する詳細情報も取得できます。
spring.flyway.outOfOrder の値は、運用環境では true、開発環境では false です。
複数のシステムがデータベース スキーマを共有する場合、デフォルト値 flyway_schema_history を使用する代わりに、システムごとに異なるメタデータ テーブル名を設定するように spring.flyway.table を構成します。

おすすめ

転載: blog.csdn.net/heqiushuang110/article/details/128948044