データベースのセットアップ - 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)

参考

サンプル

ここまでのコードサンプルは、以下より入手できます。

$ git clone -b chapter/5 https://github.com/yo1000/self-study-spring.git

results matching ""

    No results matching ""