データベースのセットアップ - Flyway
リポジトリーを作成する前に、データベースをセットアップします。以下を参考に、Flyway を使用してスクリプトを実行します。
Flyway は、コードベース、アプリケーション内にセットアップ、マイグレーションスクリプトを同梱させることで、アプリケーションのビルド時や起動時に、データベースのセットアップやマイグレーションを同時に行うものです。
類似のモジュールには、Liquibase もあり、Flyway が SQL ベースであるのに対し、Liquibase は XML ベースでスクリプトを記述し、Flyway のシンプルさを損なうかわりに、より細やかなセットアップ、マイグレーションを実現しています。
Flyway は、Spring Boot から使用する場合、デフォルトのスクリプト配置場所として、resource/db/migration
が設定されています。また、Flyway 自体はスクリプトの命名規則として V<VERSION>__<NAME>.sql
を定めています。この命名規則は、適用順を表現したバージョン番号から始まっており、V1、V2、... とファイルを作成していくことで、その順序どおりにスクリプトを実行していきます。
pom.xml
に、Flyway の依存を追加するように変更します。
<dependencies>
...
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>4.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
続いて、セットアップスクリプトを作成します。
-- src/main/resources/db/migration/V1__SetupMemo.sql
CREATE TABLE MEMO (
MEMO VARCHAR(200) NOT NULL,
AUTHOR VARCHAR(40) NOT NULL,
CREATED DATETIME NOT NULL,
PRIMARY KEY (MEMO)
);
INSERT INTO MEMO (MEMO, AUTHOR, CREATED) VALUES ('Springを学ぶ' , '金次郎' , '2016-06-23 17:57:00.0');
INSERT INTO MEMO (MEMO, AUTHOR, CREATED) VALUES ('Thymeleafを学ぶ' , '金次郎' , '2016-06-23 17:57:00.1');
INSERT INTO MEMO (MEMO, AUTHOR, CREATED) VALUES ('Flywayを学ぶ' , '金次郎' , '2016-06-23 17:57:00.2');
INSERT INTO MEMO (MEMO, AUTHOR, CREATED) VALUES ('AspectJを生麩' , '金字塔' , '2016-06-23 17:57:00.3');
Flyway、およびアプリケーションの使用する接続情報を設定します。
# src/main/resources/application.yml
spring:
datasource:
driver-class-name: org.hsqldb.jdbc.JDBCDriver
url: jdbc:hsqldb:file:memo.datastore
username: sa
password:
ここまでで一度、アプリケーションを再起動しておきます。起動ログから、Flyway を使用して、スクリプトが実行されたことがわかります。
$ ./mvnw spring-boot:run
...
2016-05-24 14:55:35.817 INFO 7119 --- [ main] o.f.core.internal.util.VersionPrinter : Flyway 4.0 by Boxfuse
2016-05-24 14:55:36.277 INFO 7119 --- [ main] hsqldb.db.HSQLDB54E1552CBE.ENGINE : Checkpoint start
2016-05-24 14:55:36.278 INFO 7119 --- [ main] hsqldb.db.HSQLDB54E1552CBE.ENGINE : checkpointClose start
2016-05-24 14:55:36.278 INFO 7119 --- [ main] hsqldb.db.HSQLDB54E1552CBE.ENGINE : checkpointClose synched
2016-05-24 14:55:36.283 INFO 7119 --- [ main] hsqldb.db.HSQLDB54E1552CBE.ENGINE : checkpointClose script done
2016-05-24 14:55:36.288 INFO 7119 --- [ main] hsqldb.db.HSQLDB54E1552CBE.ENGINE : checkpointClose end
2016-05-24 14:55:36.290 INFO 7119 --- [ main] hsqldb.db.HSQLDB54E1552CBE.ENGINE : Checkpoint end - txts: 1
2016-05-24 14:55:36.324 INFO 7119 --- [ main] o.f.c.i.dbsupport.DbSupportFactory : Database: jdbc:hsqldb:file:memo.datastore (HSQL Database Engine 2.3)
2016-05-24 14:55:36.429 INFO 7119 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 1 migration (execution time 00:00.029s)
2016-05-24 14:55:36.514 INFO 7119 --- [ main] o.f.c.i.metadatatable.MetaDataTableImpl : Creating Metadata table: "PUBLIC"."schema_version"
2016-05-24 14:55:36.536 INFO 7119 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema "PUBLIC": << Empty Schema >>
2016-05-24 14:55:36.537 INFO 7119 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema "PUBLIC" to version 1 - SetupMemo
2016-05-24 14:55:36.581 INFO 7119 --- [ main] o.f.core.internal.command.DbMigrate : Successfully applied 1 migration to schema "PUBLIC" (execution time 00:00.073s).
2016-05-24 14:55:36.795 INFO 7119 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2016-05-24 14:55:36.912 INFO 7119 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2016-05-24 14:55:36.919 INFO 7119 --- [ main] i.g.y.sss.SelfStudySpringApplication : Started SelfStudySpringApplication in 6.291 seconds (JVM running for 9.994)
参考
- https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html#howto-use-a-higher-level-database-migration-tool
- https://flywaydb.org/
- http://www.liquibase.org/
サンプル
ここまでのコードサンプルは、以下より入手できます。
$ git clone -b chapter/5 https://github.com/yo1000/self-study-spring.git