データベーステーブルのアップグレード
Liferay DXP 7.4 U10以降およびLiferay Portal7.4 GA14以降で利用可能
アプリケーションをアップグレードすると、データベースのテーブルを変更する必要がある場合があります。 Liferayのアップグレードフレームワークは、これらの変更を簡単に行うことができます。 サンプルプロジェクトをデプロイして、このアップグレード処理を確認します。 Liferayの以前のバージョンについては、 Creating Upgrade Processes for Modules を参照してください。
バージョン1.0.0をデプロイする
新しいLiferay DXPインスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/dxp:7.4.13-u86。
メールアドレス_test@liferay.com_とパスワード_test_を使用して、http://localhost:8080でLiferayにサインインしてください。 プロンプトが表示されたら、パスワードを _learn_に変更します。
次に、以下の手順を実行します。
データベーステーブルのアップグレード をダウンロードして解凍します。
curl https://resources.learn.liferay.com/dxp/latest/en/building-applications/data-frameworks/upgrade-processes/liferay-p5d2.zip -O
unzip liferay-p5d2.zip
1.0.0
ディレクトリに移動し、ビルドとデプロイを行います。cd 1.0.0
../gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
noteこのコマンドは、デプロイされたjarをDockerコンテナの/opt/liferay/osgi/modulesにコピーするのと同じです。
Liferay Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.p5d2.api_1.0.0 [1030] STARTED com.acme.p5d2.service_1.0.0 [1031]
外部データベースを使用している場合、アプリのテーブル列を確認します。 たとえば、MySQLの場合:
SHOW COLUMNS FROM P5D2_P5D2Entry;
2.0.0へのアップグレード
ここで、2.0.0版をデプロイします。
2.0.0
ディレクトリに移動し、ビルドとデプロイを行います。cd 2.0.0
../gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
Liferayにログインし、 [コントロールパネル] → [Gogo Shell] でGogoシェルコンソールに移動します。
upgrade:list com.acme.p5d2.service
というコマンドを入力し、2.0.0へのアップグレードが可能であることを確認します。upgrade:execute com.acme.p5d2.service
というコマンドを入力して、アップグレードを実行します。 Gogo シェルコンソールには、アップグレード処理の完了が表示されます。データベースでテーブル列が更新されたことを確認できます。 たとえば、MySQLの場合:
SHOW COLUMNS FROM P5D2_P5D2Entry;
コードを調べる
サンプルプロジェクトでは、以下のテーブル列を簡単に変更するデモを行っています。
変更前 | 変更後 | コメント |
---|---|---|
able (type: long) |
able (type: date) |
列のデータ型が変更されます。 |
baker (type: boolean) |
- | 列がドロップされます。 |
foo (type: string) |
bar (type: string) |
列名が変更されます。 |
- | charlie (type: string) |
新しい列が追加されます。 |
1.0.0 と 2.0.0 のservice.xml
列の定義をと比較します。
UpgradeStepRegistratorクラスの作成
UpgradeStepRegistrator
クラスを作成し、 UpgradeStepRegister
インターフェイスを実装してください。
@Component(service = UpgradeStepRegistrator.class)
public class P5D2EntryUpgrade implements UpgradeStepRegistrator {
@Override
public void register(Registry registry) {
registry.register("1.0.0", "2.0.0", new P5D2EntryUpgradeProcess());
}
}
register
メソッドをオーバーライドして、アプリのバージョンアップ登録を実装します。 必ず@Component
アノテーションを使用し、 UpgradeStepRegistrator.class
サービスとして特定します。
UpgradeProcessクラスの作成
基本クラスを拡張するUpgradeProcess
クラスを作成します。
public class P5D2EntryUpgradeProcess extends UpgradeProcess {
@Override
protected void doUpgrade() throws Exception {
alterColumnName("P5D2_P5D2Entry", "foo", "bar VARCHAR(75) null");
alterColumnType("P5D2_P5D2Entry", "able", "DATE");
alterTableAddColumn("P5D2_P5D2Entry", "charlie", "VARCHAR(75) null");
alterTableDropColumn("P5D2_P5D2Entry", "baker");
}
}
doUpgrade()
メソッドをテーブルを変更する指示でオーバーライドします。 次の操作を使用できます。
機能 | 説明 |
---|---|
alterColumnName | 列名を変更します |
alterColumnType | 列のデータ型を変更します |
alterTableAddColumn | 新しい列を追加します |
alterTableDropColumn | 列を削除します |
変更後、サービスビルダーを再実行します。 これで、アップグレードの構築とデプロイの準備が整いました。
複雑なアップグレードの管理
アップグレードのステップが多く複雑な場合は、 getPreUpgradeSteps()
と getPostUpgradeSteps()
メソッドを、 UpgradeProcess
クラスで使用することを検討してください。 このアプローチは、アップグレードプロセスをよりコントロールしやすくします。 各アップグレード・ステップには、デバッグを容易にするために、 Release_
テーブルで異なるスキーマ・バージョンが与えられます。 ステップに失敗し、アップグレードを再実行しなければならない場合、アップグレード処理は自動的にチェックし、最新の失敗ポイントからアップグレードを再開します。
例えば、Liferay の OpenIdConnectSessionUpgradeProcess はこの機能を利用しています。
この例では、 getPreUpgradeSteps()
が最初に実行され、新しいカラムを追加する単純なステップを含む。 doUpgrade()
メソッドでは、新しいカラムの入力を行う。 doUpgrade()
メソッドが失敗した場合、開発者はデバッグして必要な変更を加え、アップグレードを再実行できます。 プロセスは、最初のステップが成功したことを認識し、自動的に次のステップに進む。
アップグレードステップを利用するには、 com.liferay.portal.kernel.upgrade.UpgradeStep
クラスをアップグレードプロセスにインポートしてください。