CLOVER🍀

That was when it all began.

デヌタベヌスマむグレヌションツヌル、Flywayを詊しおみる

これは、なにをしたくお曞いたもの

以前からFlywayを1床詊そうず思っおいたのですが、そろそろいい加枛に、ず。

Flywayずは

Flywayは、Javaで実装されたデヌタベヌスのマむグレヌションツヌルです。

Homepage - Flyway

GitHub - flyway/flyway: Flyway by Redgate • Database Migrations Made Easy.

Documentation - Flyway by Redgate • Database Migrations Made Easy.

7぀のコマンドに基づいお構成されおいたす。

マむグレヌションは、SQLやJavaで蚘述するこずができ、CLIやJava API、MavenやGradleのプラグむンを利甚しお
実行したり、Spring BootやDropwizardのプラグむンなどもありたす。

Community Plugins and Integrations - Community Plugins and Integrations - Flyway by Redgate • Database Migrations Made Easy.

サポヌトされおいるデヌタベヌスは、以䞋のようです。

f:id:Kazuhira:20211005224250p:plain

Flywayには2぀のEditionがあり、Community EditionずTeam Editionがありたす。

Download + pricing - Flyway

そこそこ機胜差があっお、7぀のコマンドのうちundoはTeam Editionのみで䜿えたす。

デヌタベヌスマむグレヌションずFlywayの仕組み

Flywayのドキュメントに、どうしおデヌタベヌスマむグレヌションが必芁なのかが曞かれおいたす。

Why database migrations - Flyway by Redgate • Database Migrations Made Easy.

デヌタベヌスは、本番環境だけではなく、開発者個人の環境、CI環境、テスト環境など耇数存圚するこずが倚いでしょう。
これらのデヌタベヌスに察しお、倉曎を管理・反映しおいく必芁がありたす。

それぞれのデヌタベヌスがどのような状態になっおいるか倉曎を行うスクリプトは適甚枈みかずいった状態を管理したり、
新しくデヌタベヌスが皌働する環境が増えた時に蚭定する時はずいった課題は、開発に぀きたずう課題です。

マむグレヌションツヌルは、これを解決するためのものです。

Flywayがどのように動䜜するかは、こちらに曞かれおいたす。

How Flyway works - Flyway by Redgate • Database Migrations Made Easy.

Flywayはスキヌマを管理するテヌブルスキヌマ履歎テヌブルを䜜成し、こちらでデヌタベヌスの状態管理を
行うようです。

Flywayの実行の流れをざっくり曞くず、こんな感じみたいです。

Flywayはファむルシステムたたはクラスパスをスキャンしお、マむグレヌションを確認したす。マむグレヌションは
SQLたたはJavaで蚘述されおいたす。

ここで「マむグレヌション」ずいうのは、デヌタベヌスに察する倉曎のこずですね。Flywayではデヌタベヌスぞの倉曎を
すべおマむグレヌションず呌ぶそうです。

With Flyway all changes to the database are called migrations.

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

マむグレヌションはバヌゞョン番号に基づいお䞊び替えられ、順番に適甚したす。
この結果は、スキヌマ履歎テヌブルに反映されたす。

次にFlywayを実行した時には、再床ファむルシステムやクラスパスをスキャンし、マむグレヌションを確認したす。

怜出されたマむグレヌションずスキヌマ履歎テヌブルを確認し、珟圚適甚枈みのバヌゞョン以䞋の堎合は
そのマむグレヌションは無芖されたす。

それ以倖のマむグレヌションはペンディングされ、バヌゞョン番号で゜ヌトされた埌に適甚されたす。
そしお、スキヌマ履歎テヌブルに結果が反映されたす。

この繰り返し、ずいう感じですね。適甚するマむグレヌションは、DDL、DMLずいった皮類は問いたせん。

マむグレヌションの詳现

マむグレヌションの詳しい情報は、こちらのペヌゞを参照ですね。

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

マむグレヌションには、次の3皮類がありたす。

Undo Migrationは取り消しを衚すマむグレヌションですが、Team Editionでないず䜿えたせん 。

Versioned Migrationが䞀般的なマむグレヌションで、バヌゞョン、説明、チェックサムから成りたす。
バヌゞョンは䞀意である必芁があり、説明はマむグレヌションがどのようなものかを瀺す情報になりたす。
チェックサムはマむグレヌション自䜓の倉曎怜出に䜿われたす。

Versioned Migrationは1床だけ適甚され、その内容ずしおはDDLやDMLなどになりたす。
その適甚順は、バヌゞョン順です。基本的には単調増加する敎数で良いのですが、.や_を含んだ柔軟な倀を
指定するこずもできたす。

Repeatable Migrationは、説明ずチェックサムはあるものの、バヌゞョンのないマむグレヌションです。
実行は1床だけではなく、チェックサムが倉曎される床に再床実行されたす。

これは、ビュヌやストアドプロシヌゞャなどの䜜成、デヌタの䞀括登録などが利甚甚途のようです。

適甚順は、Versioned Migrationがすべお実行された埌にRepeatable Migrationが実行されるようです。
Repeatable Migration自䜓の適甚順は、説明の順番みたいですね。

これらのマむグレヌションは、SQLたたはJavaで実装するこずになりたす。

Migrations / SQL-based migrations

Migrations / Java-based migrations

こちらにマむグレヌションの呜名芏則、マむグレヌションのディスカバリヌ、サポヌトしおいる構文などが
蚘茉されおいたす。

説明はいったんこれくらいにしお、動かしおみるこずにしたしょう。

環境

今回は、Flywayの適甚先デヌタベヌスずしおMySQLを䜿うこずにしたす。
バヌゞョンは8.0.26を䜿い、172.17.0.2で動䜜しおいるものずしたす。

Flyway Command Lineツヌルを䜿う

たずは、FlywayのComamand Lineツヌルを䜿っおみたしょう。

Flyway Command-line - First Steps - First Steps: Command-line - Flyway by Redgate • Database Migrations Made Easy.

Spawnずいうツヌルもあり、First stepsはこちらを䜿ったドキュメントになっおいたすが、今回は䜿わないこずにしたす。

Spin up instant copies of your dev databases in the cloud for free - Spin up instant copies of your dev databases in the cloud for free - Flyway by Redgate • Database Migrations Made Easy.

珟時点の最新版は8.0.0のbetaなので、今回は7.15.0を䜿うこずにしたす。

ダりンロヌドしお

$ curl -OL https://repo1.maven.org/maven2/org/flywaydb/flyway-commandline/7.15.0/flyway-commandline-7.15.0-linux-x64.tar.gz

展開。

$ tar xf flyway-commandline-7.15.0-linux-x64.tar.gz

こんな感じのディレクトリ構成のようです。

$ find flyway-7.15.0 -maxdepth 1 -type d
flyway-7.15.0
flyway-7.15.0/sql
flyway-7.15.0/drivers
flyway-7.15.0/jre
flyway-7.15.0/lib
flyway-7.15.0/conf
flyway-7.15.0/jars
flyway-7.15.0/licenses

JREも入っおいるみたいですね。

ディレクトリ内に移動。

$ cd flyway-7.15.0

ヘルプ。

$ ./flyway --help

Javaは、AdoptOpenJDKの11が入っおいるようです。

$ jre/bin/java --version
openjdk 11.0.2 2019-01-15
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.2+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.2+9, mixed mode)

蚭定ファむルを確認しおみたす。

conf/flyway.conf

$ grep -vE '#|^$' conf/flyway.conf
flyway.locations=filesystem:sql

デフォルトでは、ファむルシステム䞊のsqlディレクトリをマむグレヌション配眮堎所に指定しおいるようです。

蚭定項目は、こちらを参照。

configuration - Configuration - Flyway by Redgate • Database Migrations Made Easy.

First stepsのドキュメントに合わせお、JDBC接続時のURLずナヌザヌ名、パスワヌドを蚭定。

$ grep -vE '#|^$' conf/flyway.conf
flyway.url=jdbc:mysql://172.17.0.2:3306/practice?characterEncoding=utf-8&characterSetResults=utf-8
flyway.user=kazuhira
flyway.password=password
flyway.locations=filesystem:sql

JDBCドラむバヌは、Flyway自䜓に含たれおいたす。

$ ll drivers | perl -wp -e 's!kazuhira!xxxxx!g'
合蚈 58580
drwxrwxr-x 3 xxxxx xxxxx     4096 10月  6 21:40 ./
drwxrwxr-x 9 xxxxx xxxxx     4096 10月  6 21:40 ../
-rw-r--r-- 1 xxxxx xxxxx    19883  9月  6 23:18 aws-secretsmanager-jdbc-1.0.6.jar
-rw-r--r-- 1 xxxxx xxxxx  3683035  9月  6 23:18 derby-10.15.2.0.jar
-rw-r--r-- 1 xxxxx xxxxx   601103  9月  6 23:18 derbyclient-10.15.2.0.jar
-rw-r--r-- 1 xxxxx xxxxx    93688  9月  6 23:18 derbyshared-10.15.2.0.jar
-rw-r--r-- 1 xxxxx xxxxx   264445  9月  6 23:18 derbytools-10.15.2.0.jar
drwxrwxr-x 2 xxxxx xxxxx     4096 10月  6 21:40 gcp/
-rw-r--r-- 1 xxxxx xxxxx   143459  9月  6 23:18 google-cloud-spanner-jdbc-2.2.6.jar
-rw-r--r-- 1 xxxxx xxxxx   346711  9月  6 23:18 google-cloud-storage-1.113.13.jar
-rw-r--r-- 1 xxxxx xxxxx  2303679  9月  6 23:18 h2-1.4.200.jar
-rw-r--r-- 1 xxxxx xxxxx  1623068  9月  6 23:18 hsqldb-2.6.0.jar
-rw-r--r-- 1 xxxxx xxxxx  1161511  9月  6 23:18 jaybird-jdk18-3.0.10.jar
-rw-r--r-- 1 xxxxx xxxxx  1484022  9月  6 23:18 jna-4.5.2.jar
-rw-r--r-- 1 xxxxx xxxxx  2327597  9月  6 23:18 jna-platform-4.5.2.jar
-rw-r--r-- 1 xxxxx xxxxx   317816  9月  6 23:18 jtds-1.3.1.jar
-rw-r--r-- 1 xxxxx xxxxx   632979  9月  6 23:18 mariadb-java-client-2.7.2.jar
-rw-r--r-- 1 xxxxx xxxxx   279641  9月  6 23:18 msal4j-1.10.1.jar
-rw-r--r-- 1 xxxxx xxxxx  1327642  9月  6 23:18 mssql-jdbc-9.2.1.jre8.jar
-rw-r--r-- 1 xxxxx xxxxx  2428323  9月  6 23:18 mysql-connector-java-8.0.24.jar
-rw-r--r-- 1 xxxxx xxxxx  4397918  9月  6 23:18 ojdbc8-19.6.0.0.jar
-rw-r--r-- 1 xxxxx xxxxx  1005078  9月  6 23:18 postgresql-42.2.19.jar
-rw-r--r-- 1 xxxxx xxxxx        0  9月  6 23:12 put-your-jdbc-drivers-here.txt
-rw-r--r-- 1 xxxxx xxxxx 28177186  9月  6 23:18 snowflake-jdbc-3.13.1.jar
-rw-r--r-- 1 xxxxx xxxxx  7296329  9月  6 23:18 sqlite-jdbc-3.34.0.jar

では、䜿っおいきたす。

たずは、察象ずなるMySQLのデヌタベヌスになにもないこずを確認。

mysql> show tables;
Empty set (0.00 sec)

sqlディレクトリに、マむグレヌションを䜜成したす。今回はSQLずしお䜜成したしょう。

sql/V1__create_book_table.sql

create table book (
  isbn varchar(14),
  title varchar(255),
  price int,
  primary key(isbn)
);

マむグレヌションの呜名芏則は、こちらを参照。

Migrations / SQL-based migrations / Naming

マむグレヌションの名前は、以䞋の芁玠で構成されたす。

  • Prefix 
 V、U、Rマむグレヌションの皮類
  • Version 
 バヌゞョン
  • Separator 
 通垞、__
  • Description 
 説明アンダヌスコアやスペヌスで区切る
  • Suffix 
 .sql

今回はV1__create_book_table.sqlで、Version Migration、バヌゞョンが1、説明は「create book table」ずなっおいたす。

infoコマンドを詊しおみたす。

Info - Info - Flyway by Redgate • Database Migrations Made Easy.

$ ./flyway info
Flyway Teams Edition 7.15.0 by Redgate
Database: jdbc:mysql://172.17.0.2:3306/practice (MySQL 8.0)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://rd.gt/3A4IWym
----------------------------------------
Schema version: << Empty Schema >>

+-----------+---------+-------------------+------+--------------+---------+----------+
| Category  | Version | Description       | Type | Installed On | State   | Undoable |
+-----------+---------+-------------------+------+--------------+---------+----------+
| Versioned | 1       | create book table | SQL  |              | Pending | No       |
+-----------+---------+-------------------+------+--------------+---------+----------+

䜜成したマむグレヌションが怜出され、ただペンディングであるこずが衚瀺されたす。

では、migrateコマンドを実行。

Migrate - Migrate - Flyway by Redgate • Database Migrations Made Easy.

$ ./flyway migrate
Flyway Teams Edition 7.15.0 by Redgate
Database: jdbc:mysql://172.17.0.2:3306/practice (MySQL 8.0)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://rd.gt/3A4IWym
----------------------------------------
Successfully validated 1 migration (execution time 00:00.020s)
Creating Schema History table `practice`.`flyway_schema_history` ...
Current version of schema `practice`: << Empty Schema >>
Migrating schema `practice` to version "1 - create book table"
Successfully applied 1 migration to schema `practice`, now at version v1 (execution time 00:00.211s)

マむグレヌションが適甚され、テヌブルが䜜成されたす。

mysql> show tables;
+-----------------------+
| Tables_in_practice    |
+-----------------------+
| book                  |
| flyway_schema_history |
+-----------------------+
2 rows in set (0.00 sec)

スキヌマ履歎テヌブルもできおいるので、䞭身を芋おみたしょう。

mysql> select * from flyway_schema_history;
+----------------+---------+-------------------+------+---------------------------+-----------+--------------+---------------------+----------------+---------+
| installed_rank | version | description       | type | script                    | checksum  | installed_by | installed_on        | execution_time | success |
+----------------+---------+-------------------+------+---------------------------+-----------+--------------+---------------------+----------------+---------+
|              1 | 1       | create book table | SQL  | V1__create_book_table.sql | 657681960 | kazuhira     | 2021-10-06 13:12:37 |            147 |       1 |
+----------------+---------+-------------------+------+---------------------------+-----------+--------------+---------------------+----------------+---------+
1 row in set (0.00 sec)

適甚したマむグレヌションの情報が衚瀺されたす。

この状態で、validateを実行しおロヌカルずの差を確認しおみたす。

Validate - Validate - Flyway by Redgate • Database Migrations Made Easy.

$ ./flyway validate
Flyway Teams Edition 7.15.0 by Redgate
Database: jdbc:mysql://172.17.0.2:3306/practice (MySQL 8.0)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://rd.gt/3A4IWym
----------------------------------------
Successfully validated 1 migration (execution time 00:00.022s)

差はありたせん。

ここで、マむグレヌションを远加しおみたす。バヌゞョンは2にしたす。

sql/V2__create_account_table.sql

create table account (
  id int,
  name varchar(50),
  registered datetime,
  about varchar(255),
  primary key(id)
);

infoで芋るず、ペンディング状態のマむグレヌションが远加されおいたす。

$ ./flyway info
Flyway Teams Edition 7.15.0 by Redgate
Database: jdbc:mysql://172.17.0.2:3306/practice (MySQL 8.0)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://rd.gt/3A4IWym
----------------------------------------
Schema version: 1

+-----------+---------+----------------------+------+---------------------+---------+----------+
| Category  | Version | Description          | Type | Installed On        | State   | Undoable |
+-----------+---------+----------------------+------+---------------------+---------+----------+
| Versioned | 1       | create book table    | SQL  | 2021-10-06 13:12:37 | Success | No       |
| Versioned | 2       | create account table | SQL  |                     | Pending | No       |
+-----------+---------+----------------------+------+---------------------+---------+----------+

ここでvalidateを実行するずロヌカルずデヌタベヌスで差があるので、NGになるこずが確認できたす。

$ ./flyway validate
Flyway Teams Edition 7.15.0 by Redgate
Database: jdbc:mysql://172.17.0.2:3306/practice (MySQL 8.0)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://rd.gt/3A4IWym
----------------------------------------
ERROR: Validate failed: Migrations have failed validation
Detected resolved migration not applied to database: 2. To fix this error, either run migrate, or set -ignorePendingMigrations=true.
Need more flexibility with validation rules? Learn more: https://rd.gt/3AbJUZE

再床migrateを実行。

$ ./flyway migrate
Flyway Teams Edition 7.15.0 by Redgate
Database: jdbc:mysql://172.17.0.2:3306/practice (MySQL 8.0)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://rd.gt/3A4IWym
----------------------------------------
Successfully validated 2 migrations (execution time 00:00.037s)
Current version of schema `practice`: 1
Migrating schema `practice` to version "2 - create account table"
Successfully applied 1 migration to schema `practice`, now at version v2 (execution time 00:00.233s)

テヌブルが远加されたした。

mysql> show tables;
+-----------------------+
| Tables_in_practice    |
+-----------------------+
| account               |
| book                  |
| flyway_schema_history |
+-----------------------+
3 rows in set (0.00 sec)

ここで、詊しにバヌゞョン1_1ず、2よりも䜎いマむグレヌションを远加しおみたす。

これをinfoで確認。

$ cp sql/V1__create_book_table.sql sql/V1_1__create_book_table.sql


$ ./flyway info
Flyway Teams Edition 7.15.0 by Redgate
Database: jdbc:mysql://172.17.0.2:3306/practice (MySQL 8.0)
----------------------------------------
Flyway Teams features are enabled by default for the next 28 days. Learn more at https://rd.gt/3A4IWym
----------------------------------------
Schema version: 2

+-----------+---------+----------------------+------+---------------------+---------+----------+
| Category  | Version | Description          | Type | Installed On        | State   | Undoable |
+-----------+---------+----------------------+------+---------------------+---------+----------+
| Versioned | 1       | create book table    | SQL  | 2021-10-06 13:12:37 | Success | No       |
| Versioned | 2       | create account table | SQL  | 2021-10-06 13:26:48 | Success | No       |
| Versioned | 1.1     | create book table    | SQL  |                     | Ignored | No       |
+-----------+---------+----------------------+------+---------------------+---------+----------+

するず、珟圚のバヌゞョンである2よりも䜎いので、無芖されるこずが確認できたす。

Flywayがバヌゞョンをどのように解釈しおいるかは、こちらを芋るずよさそうです。

https://github.com/flyway/flyway/blob/flyway-7.15.0/flyway-core/src/main/java/org/flywaydb/core/api/MigrationVersion.java

ドキュメントでも十分むメヌゞは぀かめたすけどね、より詳现に芋たい堎合は、ず。

Migrations / SQL-based migrations / Naming

远加した、無芖察象のマむグレヌションは削陀しおおきたす。

$ rm sql/V1_1__create_book_table.sql

今床はバヌゞョン3を䜜成したしょう。デヌタ登録にしたす。

sql/V3__insert_books.sql

insert into book(isbn, title, price) values('978-4798161488', 'MySQL培底入門 第4版 MySQL 8.0察応', 4180);
insert into book(isbn, title, price) values('978-4798147406', '詳解MySQL 5.7 止たらぬ進化に乗り遅れないためのテクニカルガむド', 3960);
insert into book(isbn, title, price) values('978-4873116389', '実践ハむパフォヌマンスMySQL 第3版', 5280);

migrateを実行。

$ ./flyway migrate
Flyway Teams Edition 7.15.0 by Redgate
Database: jdbc:mysql://172.17.0.2:3306/practice (MySQL 8.0)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://rd.gt/3A4IWym
----------------------------------------
Successfully validated 3 migrations (execution time 00:00.031s)
Current version of schema `practice`: 2
Migrating schema `practice` to version "3 - insert books"
Successfully applied 1 migration to schema `practice`, now at version v3 (execution time 00:00.108s)

デヌタが入りたした。

mysql> select * from book;
+----------------+------------------------------------------------------------------------------------------+-------+
| isbn           | title                                                                                    | price |
+----------------+------------------------------------------------------------------------------------------+-------+
| 978-4798147406 | 詳解MySQL 5.7 止たらぬ進化に乗り遅れないためのテクニカルガむド                           |  3960 |
| 978-4798161488 | MySQL培底入門 第4版 MySQL 8.0察応                                                        |  4180 |
| 978-4873116389 | 実践ハむパフォヌマンスMySQL 第3版                                                        |  5280 |
+----------------+------------------------------------------------------------------------------------------+-------+
3 rows in set (0.00 sec)

cleanを詊しおみたしょう。これは、スキヌマ内のオブゞェクトテヌブル、ビュヌ、ストアドプロシヌゞャなどを
砎棄しおクリヌンアップするコマンドです。もちろん、本番環境のデヌタベヌスに察しお䜿うべきコマンドではありたせん。

Clean - Clean - Flyway by Redgate • Database Migrations Made Easy.

$ ./flyway clean
Flyway Teams Edition 7.15.0 by Redgate
Database: jdbc:mysql://172.17.0.2:3306/practice (MySQL 8.0)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://rd.gt/3A4IWym
----------------------------------------
Successfully dropped pre-schema database level objects (execution time 00:00.002s)
Successfully cleaned schema `practice` (execution time 00:00.295s)
Successfully dropped post-schema database level objects (execution time 00:00.001s)

䜜成したテヌブルがキレむになくなりたした。

mysql> show tables;
Empty set (0.00 sec)

Repeatable Migrationも䜿っおみたしょう。最埌に䜜成したマむグレヌションのPrefixをRにしおバヌゞョンはなくしおみたす。

$ mv sql/V3__insert_books.sql sql/R__insert_books.sql

䞭身は、再実行可胜なようにtruncate tableも入れおおきたす。

sql/R__insert_books.sql

truncate table book;
insert into book(isbn, title, price) values('978-4798161488', 'MySQL培底入門 第4版 MySQL 8.0察応', 4180);
insert into book(isbn, title, price) values('978-4798147406', '詳解MySQL 5.7 止たらぬ進化に乗り遅れないためのテクニカルガむド', 3960);
insert into book(isbn, title, price) values('978-4873116389', '実践ハむパフォヌマンスMySQL 第3版', 5280);

この状態で、migrateを実行。

$ ./flyway migrate
Flyway Teams Edition 7.15.0 by Redgate
Database: jdbc:mysql://172.17.0.2:3306/practice (MySQL 8.0)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://rd.gt/3A4IWym
----------------------------------------
Successfully validated 3 migrations (execution time 00:00.031s)
Creating Schema History table `practice`.`flyway_schema_history` ...
Current version of schema `practice`: << Empty Schema >>
Migrating schema `practice` to version "1 - create book table"
Migrating schema `practice` to version "2 - create account table"
Migrating schema `practice` with repeatable migration "insert books"
Successfully applied 3 migrations to schema `practice`, now at version v2 (execution time 00:01.017s)

デヌタが入りたした。

mysql> select * from book;
+----------------+------------------------------------------------------------------------------------------+-------+
| isbn           | title                                                                                    | price |
+----------------+------------------------------------------------------------------------------------------+-------+
| 978-4798147406 | 詳解MySQL 5.7 止たらぬ進化に乗り遅れないためのテクニカルガむド                           |  3960 |
| 978-4798161488 | MySQL培底入門 第4版 MySQL 8.0察応                                                        |  4180 |
| 978-4873116389 | 実践ハむパフォヌマンスMySQL 第3版                                                        |  5280 |
+----------------+------------------------------------------------------------------------------------------+-------+
3 rows in set (0.00 sec)

infoで芋おみたす。

$ ./flyway info
Flyway Teams Edition 7.15.0 by Redgate
Database: jdbc:mysql://172.17.0.2:3306/practice (MySQL 8.0)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://rd.gt/3A4IWym
----------------------------------------
Schema version: 2

+------------+---------+----------------------+------+---------------------+---------+----------+
| Category   | Version | Description          | Type | Installed On        | State   | Undoable |
+------------+---------+----------------------+------+---------------------+---------+----------+
| Versioned  | 1       | create book table    | SQL  | 2021-10-06 13:45:23 | Success | No       |
| Versioned  | 2       | create account table | SQL  | 2021-10-06 13:45:24 | Success | No       |
| Repeatable |         | insert books         | SQL  | 2021-10-06 13:45:24 | Success |          |
+------------+---------+----------------------+------+---------------------+---------+----------+

デヌタも確認。

mysql> select * from flyway_schema_history;
+----------------+---------+----------------------+------+------------------------------+------------+--------------+---------------------+----------------+---------+
| installed_rank | version | description          | type | script                       | checksum   | installed_by | installed_on        | execution_time | success |
+----------------+---------+----------------------+------+------------------------------+------------+--------------+---------------------+----------------+---------+
|              1 | 1       | create book table    | SQL  | V1__create_book_table.sql    |  657681960 | kazuhira     | 2021-10-06 13:45:23 |            116 |       1 |
|              2 | 2       | create account table | SQL  | V2__create_account_table.sql | 1435889679 | kazuhira     | 2021-10-06 13:45:24 |            275 |       1 |
|              3 | NULL    | insert books         | SQL  | R__insert_books.sql          | -871738101 | kazuhira     | 2021-10-06 13:45:24 |            428 |       1 |
+----------------+---------+----------------------+------+------------------------------+------------+--------------+---------------------+----------------+---------+
3 rows in set (0.00 sec)

ここで、デヌタを远加しおみたす。

sql/R__insert_books.sql

truncate table book;
insert into book(isbn, title, price) values('978-4798161488', 'MySQL培底入門 第4版 MySQL 8.0察応', 4180);
insert into book(isbn, title, price) values('978-4798147406', '詳解MySQL 5.7 止たらぬ進化に乗り遅れないためのテクニカルガむド', 3960);
insert into book(isbn, title, price) values('978-4873116389', '実践ハむパフォヌマンスMySQL 第3版', 5280);
insert into book(isbn, title, price) values('978-4295000297', 'MySQL 即効ク゚リチュヌニング', 1980);

infoで確認しおみるず、ペンディング状態のマむグレヌションが怜出されたす。

$ ./flyway info
Flyway Teams Edition 7.15.0 by Redgate
Database: jdbc:mysql://172.17.0.2:3306/practice (MySQL 8.0)
----------------------------------------
Flyway Teams features are enabled by default for the next 28 days. Learn more at https://rd.gt/3A4IWym
----------------------------------------
Schema version: 2

+------------+---------+----------------------+------+---------------------+----------+----------+
| Category   | Version | Description          | Type | Installed On        | State    | Undoable |
+------------+---------+----------------------+------+---------------------+----------+----------+
| Versioned  | 1       | create book table    | SQL  | 2021-10-06 13:45:23 | Success  | No       |
| Versioned  | 2       | create account table | SQL  | 2021-10-06 13:45:24 | Success  | No       |
| Repeatable |         | insert books         | SQL  | 2021-10-06 13:45:24 | Outdated |          |
| Repeatable |         | insert books         | SQL  |                     | Pending  |          |
+------------+---------+----------------------+------+---------------------+----------+----------+

migrateを実行しおみたす。

$ ./flyway migrate

するず、Repeatable Migrationが1レコヌド远加されたす。前に適甚したものは、「眮き換えられたもの」ずいう
扱いになるようです。

$ ./flyway info
Flyway Teams Edition 7.15.0 by Redgate
Database: jdbc:mysql://172.17.0.2:3306/practice (MySQL 8.0)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://rd.gt/3A4IWym
----------------------------------------
Schema version: 2

+------------+---------+----------------------+------+---------------------+------------+----------+
| Category   | Version | Description          | Type | Installed On        | State      | Undoable |
+------------+---------+----------------------+------+---------------------+------------+----------+
| Versioned  | 1       | create book table    | SQL  | 2021-10-06 13:45:23 | Success    | No       |
| Versioned  | 2       | create account table | SQL  | 2021-10-06 13:45:24 | Success    | No       |
| Repeatable |         | insert books         | SQL  | 2021-10-06 13:45:24 | Superseded |          |
| Repeatable |         | insert books         | SQL  | 2021-10-06 13:51:32 | Success    |          |
+------------+---------+----------------------+------+---------------------+------------+----------+

スキヌマ履歎テヌブルも確認。

mysql> select * from flyway_schema_history;
+----------------+---------+----------------------+------+------------------------------+-------------+--------------+---------------------+----------------+---------+
| installed_rank | version | description          | type | script                       | checksum    | installed_by | installed_on        | execution_time | success |
+----------------+---------+----------------------+------+------------------------------+-------------+--------------+---------------------+----------------+---------+
|              1 | 1       | create book table    | SQL  | V1__create_book_table.sql    |   657681960 | kazuhira     | 2021-10-06 13:45:23 |            116 |       1 |
|              2 | 2       | create account table | SQL  | V2__create_account_table.sql |  1435889679 | kazuhira     | 2021-10-06 13:45:24 |            275 |       1 |
|              3 | NULL    | insert books         | SQL  | R__insert_books.sql          |  -871738101 | kazuhira     | 2021-10-06 13:45:24 |            428 |       1 |
|              4 | NULL    | insert books         | SQL  | R__insert_books.sql          | -1366018225 | kazuhira     | 2021-10-06 13:51:32 |            175 |       1 |
+----------------+---------+----------------------+------+------------------------------+-------------+--------------+---------------------+----------------+---------+
4 rows in set (0.00 sec)

デヌタが入っおいるこずも確認。

mysql> select * from book;
+----------------+------------------------------------------------------------------------------------------+-------+
| isbn           | title                                                                                    | price |
+----------------+------------------------------------------------------------------------------------------+-------+
| 978-4295000297 | MySQL 即効ク゚リチュヌニング                                                             |  1980 |
| 978-4798147406 | 詳解MySQL 5.7 止たらぬ進化に乗り遅れないためのテクニカルガむド                           |  3960 |
| 978-4798161488 | MySQL培底入門 第4版 MySQL 8.0察応                                                        |  4180 |
| 978-4873116389 | 実践ハむパフォヌマンスMySQL 第3版                                                        |  5280 |
+----------------+------------------------------------------------------------------------------------------+-------+
4 rows in set (0.00 sec)

最埌にcleanで砎棄しおおきたしょう。

$ ./flyway clean
Flyway Teams Edition 7.15.0 by Redgate
Database: jdbc:mysql://172.17.0.2:3306/practice (MySQL 8.0)
----------------------------------------
Flyway Teams features are enabled by default for the next 27 days. Learn more at https://rd.gt/3A4IWym
----------------------------------------
Successfully dropped pre-schema database level objects (execution time 00:00.001s)
Successfully cleaned schema `practice` (execution time 00:00.279s)
Successfully dropped post-schema database level objects (execution time 00:00.008s)

これで、Command Lineツヌルを䜿っお基本的な䜿い方は確認できたのではないでしょうか。

Java APIを䜿う

最埌に、Java APIも䜿っおみたしょう。
先ほどたでFlywayのComnand Lineツヌルで実行しおいたこずを、Javaで行う感じですね。

ドキュメントは、このあたりを参考に。

API - First Steps - First Steps: API - Flyway by Redgate • Database Migrations Made Easy.

API - API - Flyway by Redgate • Database Migrations Made Easy.

環境。

$ java --version
openjdk 11.0.11 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing)


$ mvn --version
Apache Maven 3.8.3 (ff8e977a158738155dc465c6a97ffaf31982d739)
Maven home: $HOME/.sdkman/candidates/maven/current
Java version: 11.0.11, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-88-generic", arch: "amd64", family: "unix"

Maven䟝存関係。FlywayずMySQLのJDBCドラむバヌです。

    <dependencies>
        <dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
            <version>7.15.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

䜜成した゜ヌスコヌド。

src/main/java/org/littlewings/flyway/App.java

package org.littlewings.flyway;

import org.flywaydb.core.Flyway;

public class App {
    public static void main(String... args) {
        Flyway flyway =
                Flyway
                        .configure()
                        .dataSource(
                                "jdbc:mysql://172.17.0.2:3306/practice?characterEncoding=utf-8&characterSetResults=utf-8",
                                "kazuhira",
                                "password"
                        )
                        .load();

        flyway.migrate();
    }
}

Flywayクラスのむンスタンスを䜜成しお、migrateメ゜ッドなどのFlywayのコマンドに察応するメ゜ッドを
呌び出したす。

FlywayクラスのJavadocはこちら。

API: Javadoc - Flyway by Redgate • Database Migrations Made Easy.

今回、蚭定はデヌタ゜ヌスJDBC URL、ナヌザヌ名、パスワヌドのみにずどめおいたす。

マむグレヌションは、どこから怜出するかずいうず

flyway.locations - Locations - Flyway by Redgate • Database Migrations Made Easy.

デフォルト倀のclasspath:db/migrationずなりたす。クラスパス䞊ですね。

Locations / Default

ずいうわけで、今回はsrc/main/resources/db/migrationディレクトリにCommand Lineツヌルで䜿った時ず同じ
マむグレヌションSQLファむルを配眮したす。

$ tree src/main/resources
src/main/resources
└── db
    └── migration
        ├── R__insert_books.sql
        ├── V1__create_book_table.sql
        └── V2__create_account_table.sql

2 directories, 3 files

ちなみに、蚭定をもうちょっず詳现に行う堎合は、FlywayクラスのコンストラクタにConfigurationむンタヌフェヌスの
実装クラスのむンスタンスを枡したす。

Configurationむンタヌフェヌスの実装ずしおは、ClassicConfiguration、FluentConfigurationの2皮類がありたす。

では、実行。

$ mvn compile exec:java -Dexec.mainClass=org.littlewings.flyway.App

ログが出力され、Flywayが実行されおいる様子がわかりたす。

[INFO] --- exec-maven-plugin:3.0.0:java (default-cli) @ flyway-example ---
10月 07, 2021 12:29:56 午前 org.flywaydb.core.internal.license.VersionPrinter printVersionOnly
情報: Flyway Community Edition 7.15.0 by Redgate
10月 07, 2021 12:29:56 午前 org.flywaydb.core.internal.database.base.BaseDatabaseType createDatabase
情報: Database: jdbc:mysql://172.17.0.2:3306/practice (MySQL 8.0)
10月 07, 2021 12:29:56 午前 org.flywaydb.core.internal.command.DbValidate validate
情報: Successfully validated 3 migrations (execution time 00:00.022s)
10月 07, 2021 12:29:56 午前 org.flywaydb.core.internal.schemahistory.JdbcTableSchemaHistory create
情報: Creating Schema History table `practice`.`flyway_schema_history` ...
10月 07, 2021 12:29:57 午前 org.flywaydb.core.internal.command.DbMigrate migrateGroup
情報: Current version of schema `practice`: << Empty Schema >>
10月 07, 2021 12:29:57 午前 org.flywaydb.core.internal.command.DbMigrate doMigrateGroup
情報: Migrating schema `practice` to version "1 - create book table"
10月 07, 2021 12:29:57 午前 org.flywaydb.core.internal.command.DbMigrate doMigrateGroup
情報: Migrating schema `practice` to version "2 - create account table"
10月 07, 2021 12:29:57 午前 org.flywaydb.core.internal.command.DbMigrate doMigrateGroup
情報: Migrating schema `practice` with repeatable migration "insert books"
10月 07, 2021 12:29:57 午前 org.flywaydb.core.internal.command.DbMigrate logSummary
情報: Successfully applied 3 migrations to schema `practice`, now at version v2 (execution time 00:00.630s)

デヌタベヌス偎も確認。デヌタも入っおいたすね。

mysql> show tables;
+-----------------------+
| Tables_in_practice    |
+-----------------------+
| account               |
| book                  |
| flyway_schema_history |
+-----------------------+
3 rows in set (0.00 sec)


mysql> select * from book;
+----------------+------------------------------------------------------------------------------------------+-------+
| isbn           | title                                                                                    | price |
+----------------+------------------------------------------------------------------------------------------+-------+
| 978-4295000297 | MySQL 即効ク゚リチュヌニング                                                             |  1980 |
| 978-4798147406 | 詳解MySQL 5.7 止たらぬ進化に乗り遅れないためのテクニカルガむド                           |  3960 |
| 978-4798161488 | MySQL培底入門 第4版 MySQL 8.0察応                                                        |  4180 |
| 978-4873116389 | 実践ハむパフォヌマンスMySQL 第3版                                                        |  5280 |
+----------------+------------------------------------------------------------------------------------------+-------+
4 rows in set (0.00 sec)

これで、Java APIの方も確認できたした、ず。

たずめ

Flywayを䜿ったこずがなかったので、今回はどういうものかを確認する意味も含めお、ドキュメントの蚘茉内容から
基本的な䜿い方たでを確認しおみたした。

なんずなくむメヌゞは知っおいる぀もりでしたが、ちゃんず䜿っおみた方がやっぱり理解が進みたすね。

そのうち、Spring BootやQuarkusあたりに組み蟌んだものず合わせお䜿っおみたいものです。