Liquibaseを使用してデータベーススキーマを安全に進化させる
1. 概要
このクイックチュートリアルでは、Java WebアプリケーションのLiquibase to evolve the database schemaを利用します。
最初に一般的なJavaアプリに焦点を当て、SpringとHibernateで利用できるいくつかの興味深いオプションについても焦点を当てて見ていきます。
非常に簡単に言えば、Liquibaseの使用の中核はthe changeLog fileです。これは、DBを更新するために実行する必要のあるすべての変更を追跡するXMLファイルです。
pom.xmlに追加する必要があるMavenの依存関係から始めましょう。
org.liquibase
liquibase-core
3.4.1
新しいバージョンのliquibase-corehereがあるかどうかを確認することもできます。
参考文献:
Flywayを使用したデータベースの移行
この記事では、Flywayの主要な概念と、このフレームワークを使用してアプリケーションのデータベーススキーマを確実かつ簡単に継続的に再構築する方法について説明します。
2. データベース変更ログ
ここで、単純なchangeLogファイルを見てみましょう。このファイルは、列「address」をテーブル「users」に追加するだけです。
変更セットがidとauthorによってどのように識別されるかに注意してください。これにより、変更セットを一意に識別して1回だけ適用できるようになります。
これをアプリケーションに接続する方法を見て、アプリケーションの起動時に実行されることを確認しましょう。
3. SpringBeanでLiquibaseを実行する
アプリケーションの起動時に変更を実行する最初のオプションは、Spring Beanを使用することです。 もちろん、他にも多くの方法がありますが、Springアプリケーションを扱っている場合、これは優れた簡単な方法です。
@Bean
public SpringLiquibase liquibase() {
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setChangeLog("classpath:liquibase-changeLog.xml");
liquibase.setDataSource(dataSource());
return liquibase;
}
クラスパスに存在する必要がある有効なchangeLogファイルをポイントしていることに注意してください。
4. SpringBootでLiquibaseを使用する
Spring Bootを使用している場合、LiquibaseにBeanを定義する必要はありません。
必要なのは変更ログを「db/changelog/db.changelog-master.yaml」に入れることだけで、Liquibaseの移行は起動時に自動的に実行されます。
ご了承ください:
-
「liquibase-core」依存関係を追加する必要があります。
-
「liquibase.change-log」プロパティを使用して、デフォルトの変更ログファイルを変更できます。次に例を示します。
liquibase.change-log=classpath:liquibase-changeLog.xml
5. Spring BootでLiquibaseを無効にする
場合によっては、起動時にLiquibase移行の実行を無効にする必要があります。
The simplest option we have is to use a spring.liquibase.enabled property。 この方法では、残りのすべてのLiquibase構成は変更されません。
Spring Boot2の例を次に示します。
spring.liquibase.enabled=false
Spring Boot 1.xの場合、liquibase.enabledプロパティを使用する必要があります。
liquibase.enabled=false
6. Mavenプラグインを使用してchangeLogを生成します
changeLogファイルを手動で書き込む代わりに、Liquibase Mavenプラグインを使用して生成し、多くの作業を節約できます。
6.1. プラグイン構成
pom.xmlの変更点は次のとおりです。
org.liquibase
liquibase-maven-plugin
3.4.1
...
org.liquibase
liquibase-maven-plugin
3.4.1
src/main/resources/liquibase.properties
6.2. 既存のデータベースからChangeLogを生成する
プラグインを使用して、既存のデータベースから変更ログを生成できます。
mvn liquibase:generateChangeLog
liquibase propertiesは次のとおりです。
url=jdbc:mysql://localhost:3306/oauth_reddit
username=tutorialuser
password=tutorialmy5ql
driver=com.mysql.jdbc.Driver
outputChangeLogFile=src/main/resources/liquibase-outputChangeLog.xml
最終結果はchangeLogファイルであり、これを使用して初期DBスキーマを作成するか、データを入力することができます。 サンプルアプリの場合は次のようになります。
...
6.3. 2つのデータベース間の差分からChangeLogを生成します
プラグインを使用して、2つの既存のデータベース(開発と本番など)の違いからchangeLogファイルを生成できます。
mvn liquibase:diff
プロパティは次のとおりです。
changeLogFile=src/main/resources/liquibase-changeLog.xml
url=jdbc:mysql://localhost:3306/oauth_reddit
username=tutorialuser
password=tutorialmy5ql
driver=com.mysql.jdbc.Driver
referenceUrl=jdbc:h2:mem:oauth_reddit
diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml
referenceDriver=org.h2.Driver
referenceUsername=sa
referencePassword=
そして、生成されたchangeLogのスニペットは次のとおりです。
これは、たとえばHibernateが開発用の新しいスキーマを自動生成し、それを古いスキーマに対する参照ポイントとして使用することにより、DBを進化させるための非常に強力な方法です。
7. LiquibaseHibernateプラグインを使用する
アプリケーションがHibernateを使用している場合、changeLogを生成する非常に便利な方法を見ていきます。
まず、Mavenでthe liquibase-hibernate pluginを構成する方法は次のとおりです。
7.1. プラグイン構成
まず、新しいプラグインを構成し、適切な依存関係を使用してみましょう。
org.liquibase
liquibase-maven-plugin
3.4.1
src/main/resources/liquibase.properties
org.liquibase.ext
liquibase-hibernate4
3.5
org.springframework
spring-beans
4.1.7.RELEASE
org.springframework.data
spring-data-jpa
1.7.3.RELEASE
7.2. データベースと永続エンティティ間の差分からchangeLogを生成します
さて、楽しい部分です。 このプラグインを使用して、既存のデータベース(本番環境など)と新しい永続エンティティの違いからchangeLogファイルを生成できます。
したがって、簡単にするために、エンティティが変更されると、古いDBスキーマに対して変更を生成し、a clean, powerful way to evolve your schema in productionを取得できます。
liquibaseのプロパティは次のとおりです。
changeLogFile=classpath:liquibase-changeLog.xml
url=jdbc:mysql://localhost:3306/oauth_reddit
username=tutorialuser
password=tutorialmy5ql
driver=com.mysql.jdbc.Driver
referenceUrl=hibernate:spring:org.example.persistence.model
?dialect=org.hibernate.dialect.MySQLDialect
diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml
注:referenceUrlはパッケージスキャンを使用しているため、dialectパラメータが必要です。
8. 結論
このチュートリアルでは、Liquibaseを使用して、evolving and refactoring the DB schema of a Java appの安全で成熟した方法を実現するいくつかの方法を説明しました。
これらすべての例とコードスニペットcan be found inmy github projectの実装–これはEclipseベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。