TL; DR
FlywayでMySQLのコンテナにマイグレーションします。
ソースはこちら
https://github.com/OskaMathis/flyway-sample
Flyway
オープンソースのDBマイグレーションツールです。使い方がシンプルなので好印象。
今回は公式で用意されているDockerイメージを使ってマイグレーション環境を構築します。
環境構築
設定ファイル作成
Flywayとマイグレーションを実行するDBの設定をします。
flyway.url=jdbc:mysql://db/sample
flyway.user=root
flyway.password=root
version: '3.4'
x-template: &flyway-template
image: flyway/flyway:6.0.1
volumes:
- ./sql:/flyway/sql
- ./conf:/flyway/conf
services:
flyway-clean:
<<: *flyway-template
command: clean
flyway-migrate:
<<: *flyway-template
command: migrate
flyway-info:
<<: *flyway-template
command: info
flyway-repair:
<<: *flyway-template
command: repair
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: sample
MYSQL_ROOT_PASSWORD: root
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
ports:
- 3306:3306
SQL作成
Flywayで使用するSQLファイルには命名規則が存在するので要注意です。
(参考: https://flywaydb.org/documentation/migrations#naming)
CREATE TABLE users (id INT, name VARCHAR(45));
INSERT INTO users VALUES (1, "anonymous user");
ディレクトリ構成
$ tree
.
├── conf
│ └── flyway.conf
├── docker-compose.yml
└── sql
├── V0.1.0__create_table.sql
└── V0.1.1__insert_data.sql
実行
DBコンテナ起動
$ docker-compose up -d db
Creating network "sample_flyway_default" with the default driver
Creating sample_flyway_db_1 ... done
マイグレーション
sqlディレクトリ内のSQLファイルがバージョンの順に実行されます。
コンテナ起動直後に実行するとエラーが出ることがありますので、コンテナがちゃんと立ち上がりきるまで待ちましょう。
$ docker-compose run --rm flyway-migrate
Flyway Community Edition 6.0.1 by Boxfuse
Database: jdbc:mysql://db/sample (MySQL 5.7)
Successfully validated 2 migrations (execution time 00:00.032s)
Creating Schema History table `sample`.`flyway_schema_history` ...
Current version of schema `sample`: << Empty Schema >>
Migrating schema `sample` to version 0.0.1 - create table
Migrating schema `sample` to version 0.0.2 - insert data
Successfully applied 2 migrations to schema `sample` (execution time 00:00.264s)
マイグレーション履歴
どのバージョンのマイグレーションまで実行されているかを出力してくれます。
$ docker-compose run --rm flyway-info
Flyway Community Edition 6.0.1 by Boxfuse
Database: jdbc:mysql://db/sample (MySQL 5.7)
Schema version: 0.0.2
+-----------+---------+--------------+------+---------------------+---------+
| Category | Version | Description | Type | Installed On | State |
+-----------+---------+--------------+------+---------------------+---------+
| Versioned | 0.0.1 | create table | SQL | 2019-09-11 03:15:25 | Success |
| Versioned | 0.0.2 | insert data | SQL | 2019-09-11 03:15:25 | Success |
+-----------+---------+--------------+------+---------------------+---------+
データベース上の全テーブル削除
やんごとなき理由でDBの中身を一度リセットしたい場合に実行すると良いでしょう。
Flywayで作成してないテーブルに関しても削除されます。
$ docker-compose run --rm flyway-clean
Flyway Community Edition 6.0.1 by Boxfuse
Database: jdbc:mysql://db/sample (MySQL 5.7)
Successfully cleaned schema `sample` (execution time 00:00.044s)
$ docker-compose run --rm flyway-info
Flyway Community Edition 6.0.1 by Boxfuse
Database: jdbc:mysql://db/sample (MySQL 5.7)
Schema version: << Empty Schema >>
+-----------+---------+--------------+------+--------------+---------+
| Category | Version | Description | Type | Installed On | State |
+-----------+---------+--------------+------+--------------+---------+
| Versioned | 0.0.1 | create table | SQL | | Pending |
| Versioned | 0.0.2 | insert data | SQL | | Pending |
+-----------+---------+--------------+------+--------------+---------+
マイグレーション失敗時の修復
マイグレーションに失敗すると、 State
が Failed
になるのですが、この状態でSQLを修正して再度マイグレーションしようとしてもエラーになります。
$ docker-compose run --rm flyway-info
Flyway Community Edition 6.0.1 by Boxfuse
Database: jdbc:mysql://db/sample (MySQL 5.7)
Schema version: 0.0.2
+-----------+---------+--------------+------+---------------------+---------+
| Category | Version | Description | Type | Installed On | State |
+-----------+---------+--------------+------+---------------------+---------+
| Versioned | 0.0.1 | create table | SQL | 2019-09-11 03:28:11 | Success |
| Versioned | 0.0.2 | insert data | SQL | 2019-09-11 03:28:11 | Failed |
+-----------+---------+--------------+------+---------------------+---------+
$ docker-compose run --rm flyway-migrate
Flyway Community Edition 6.0.1 by Boxfuse
Database: jdbc:mysql://db/sample (MySQL 5.7)
ERROR: Validate failed: Detected failed migration to version 0.0.2 (insert data)
repair
コマンドを実行することで該当のマイグレーションが Pending
になるので、マイグレーションが実行可能になります。
$ docker-compose run --rm flyway-repair
Flyway Community Edition 6.0.1 by Boxfuse
Database: jdbc:mysql://db/sample (MySQL 5.7)
Successfully repaired schema history table `sample`.`flyway_schema_history` (execution time 00:00.073s).
$ docker-compose run --rm flyway-info
Flyway Community Edition 6.0.1 by Boxfuse
Database: jdbc:mysql://db/sample (MySQL 5.7)
Schema version: 0.0.1
+-----------+---------+--------------+------+---------------------+---------+
| Category | Version | Description | Type | Installed On | State |
+-----------+---------+--------------+------+---------------------+---------+
| Versioned | 0.0.1 | create table | SQL | 2019-09-11 04:34:13 | Success |
| Versioned | 0.0.2 | insert data | SQL | | Pending |
+-----------+---------+--------------+------+---------------------+---------+
$ docker-compose run --rm flyway-migrate
Flyway Community Edition 6.0.1 by Boxfuse
Database: jdbc:mysql://db/sample (MySQL 5.7)
Successfully validated 2 migrations (execution time 00:00.033s)
Current version of schema `sample`: 0.0.1
Migrating schema `sample` to version 0.0.2 - insert data
Successfully applied 1 migration to schema `sample` (execution time 00:00.159s)