takeda_san’s blog

KotlinとVRを頑張っていく方向。

Flywayを最初からやってみる

きっかけ

この素晴らしき記事を写経していた時である。
(ほんとに素晴らしいのでみんなも写経しような)

SpringBoot+Vue.js+ElementUI+Firebaseでマスタ管理アプリ入門

Flyway…すでにあるファイルをコピペでバージョン増やしてるだけで自分でイチからやったことないな…
そもそも、バージョンってどういう仕組みやねんという酷い状況だったので改めてやっていきましょう。

今回のリポジトリはここ。
github.com

環境を作ろう

プロジェクトを作ろう

Spring Initializrでオリャっとひな形を作ります。
dependenciesの設定、Flywayまであるのね。

f:id:takeda_san:20181013104039p:plain

DBはお手軽H2DBでやります。
あとはお好きなIDEで読み込みましょう。

H2の接続設定をしよう

application.propertiesにH2の接続設定を追加します。
あと今回はh2のconsoleで結果を確認するのでspring.h2.console.enabled=trueも入れる。

メモリ上のtestという名前のDBに接続するよって感じです。

# H2
spring.h2.console.enabled=true

# Database
spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_ON_EXIT=TRUE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

マイグレーション用のSQLファイルを作ろう

ここによると、クラスパスのdb/migrationの下にSQLファイルを作ろうな。
ということらしい。

Migrations - Migrations - Flyway by Boxfuse • Database Migrations Made Easy.

f:id:takeda_san:20181013110246p:plain

V1__create_table.sql

CREATE TABLE `person` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(64) NOT NULL,
  PRIMARY KEY (`id`)
)

実行して様子を見てみよう

よいしょっとアプリケーション起動してみましょう。
mainからでもbootRunでも起動できればそれでよい。

2018-10-13 10:53:07.033  INFO 6152 --- [           main] o.f.core.internal.util.VersionPrinter    : Flyway Community Edition 5.0.7 by Boxfuse
2018-10-13 10:53:07.038  INFO 6152 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2018-10-13 10:53:07.190  INFO 6152 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2018-10-13 10:53:07.196  INFO 6152 --- [           main] o.f.c.internal.database.DatabaseFactory  : Database: jdbc:h2:mem:test (H2 1.4)
2018-10-13 10:53:07.268  INFO 6152 --- [           main] o.f.core.internal.command.DbValidate     : Successfully validated 1 migration (execution time 00:00.025s)
2018-10-13 10:53:07.314  INFO 6152 --- [           main] o.f.c.i.s.JdbcTableSchemaHistory         : Creating Schema History table: "PUBLIC"."flyway_schema_history"
2018-10-13 10:53:07.348  INFO 6152 --- [           main] o.f.core.internal.command.DbMigrate      : Current version of schema "PUBLIC": << Empty Schema >>
2018-10-13 10:53:07.349  INFO 6152 --- [           main] o.f.core.internal.command.DbMigrate      : Migrating schema "PUBLIC" to version 1 - create table
2018-10-13 10:53:07.370  INFO 6152 --- [           main] o.f.core.internal.command.DbMigrate      : Successfully applied 1 migration to schema "PUBLIC" (execution time 00:00.063s)

こんなログが出てればうまくいってそうな雰囲気。

H2 consoleで実際にテーブルができているか確認しに行く。
デフォルトだとこれでアクセスできる。
http://localhost:8080/h2-console

こんな感じでオイショっと接続。
f:id:takeda_san:20181013110728p:plain

無事できてますね。
f:id:takeda_san:20181013110807p:plain

flyway_schema_historyという作った覚えのないテーブルもありますね。
マイグレーションファイルごとに適用済みかそうでないかのような内容っぽい。
f:id:takeda_san:20181013112546p:plain

マイグレーションファイルを追加してみよう

INSERT文でデータを突っ込んでみる。

V1.1__insert_data.sql

INSERT INTO person VALUES (1, 'hoge-san');
INSERT INTO person VALUES (2, 'piyo-san');

実行後。
f:id:takeda_san:20181013113530p:plain

f:id:takeda_san:20181013113702p:plain

なるほど、すべて理解しましたワ。