Spring Bootでliquibaseを使う方法(MySQL)

Spring Bootでliquibaseを使う方法(MySQL)
Springバージョン
2.1.1.RELEASE

liquibase(リキベース)を使うとSpring Bootアプリケーションを実行する際にデータベースを作成して、さらにテーブルを作成したりデータ投入したり、テーブル削除したりと、マイグレーション管理ができるようです。

とりあえずデータベース作成して、テーブルをcreateしたかったのでliquibaseを使ってみました。

Spring Bootのスタータープロジェクトからliquibaseを選択します。

Spring Bootでliquibaseを使う方法(MySQL)

テーブルを作成するにはxml形式かyml形式でファイルを作成します。Spring Bootアプリケーション起動時に順次読み込んでテーブルを作成していってくれます。

前提として、ローカルPCにMySQLがインストールされていることとします。

build.gradleを以下のように修正します。これで起動時にliquibaseが実行されます。

公式サイトを見るとどうもデフォルトのファイル名はdb.changelog-master.yamlのようです。

src\main\resources\db\db.changelog-master.yamlを配置します。

db.changelog-master.yaml

複数ある場合は改行してファイル名を指定していきます。

複数ファイルある場合のdb.changelog-master.yaml(デフォルトのファイル名です)の中身は以下のようになると思います。

上記ではa.yamlを読み込んだ後にb.yamlを読み込みます。

db.changelog-master.yamlでテーブル作成したりもできますし、上記のようにファイル分割することもできます。

a.yamlの記述例です。

参考サイト

プロパティ名

MySQLにクエリパラメータでプロパティを設定することができます。

createDatabaseIfNotExist=true … データベースが存在しなければデータベースを作成する

参考サイト

application.properties

このファイルにMySQLの接続情報を記載しておきます。

spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.yamlでクラスパスとファイル名を変更できます。

Spring Bootアプリケーションを実行する

ではSpring Bootアプリケーションを実行してみます。sampledbというデータベースが作成され、databasechangelogテーブル、databasechangeloglockテーブル、personテーブルが作成されればOKです。

テーブルにカラムを追加する

liquibaseはテーブルを作成しますが、そのあとテーブルのカラムが追加だったりした場合に新たにymlファイルを作成して、既存テーブルに対してALTER TABLE文を発行します。

ALTER TABLE文の実行方法は以下のようにします。

これで以下を実行するのと同じになります。MySQLではcatalogNameとschemaNameは省略可能です。

カラムを複数追加したい場合は- column:の箇所を追加したい文だけ記述します。

テーブルのカラム名をリネームする

liquibaseはマイグレーションツールですが、簡単に言うとテーブル作成します。で、カラム名変わったのでカラム名を変更します。そのあとにテーブルが不要になったのでdropします、というような履歴ツールです。

今回はカラム名をリネームするymlを作成します。

これでカラム名をリネームできるのですが、旧カラム名にnot null制約がついていた場合、制約が消えてしまいます。その場合は以下のように記述する必要があります。

テーブルのカラムの型を変更する

テーブルのカラムの型を変更するymlを作成します。以下ではintに変更しています。

ユニークキーを付ける

ユニークキーを付けます。

以下と同様です。

初期データをインサートする

liquibaseはテーブルを作成してくれますが、作成時はレコードがありません。

これは不便なのですが、もちろん初期レコードをインサートすることも可能です。

これはテーブルを作成してから2件インサートしている例です。

DATABASECHANGELOGテーブルを触る

DATABASECHANGELOGテーブルは管理テーブルですが、何かの拍子でおかしくなればそのエラーが出ているymlファイルの1レコードだけを削除して、再度実行することができます。

この時、yamlに記載されているのがCREATE TABLEだったら、あらかじめDROP TABLEしておくなどの対応は必要です。

DATABASECHANGELOGLOCKテーブルは触ることはない気がします。

スポンサーリンク
  • このエントリーをはてなブックマークに追加
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA