なぜ、Flywayでテーブルを作るのか?
開発現場では必ずMySQLやPostgres、Oracleなどのデータベースを使います。
最初にまとめてどかっとCREATE文が配られて、開発を進めていくのが通例だと思います。その後、開発が進んでいくにつれて、「あのカラムがいる、このテーブルがいる…」とテーブルには変更が入っていきますね。
その都度、自分でAlter table文を書いたり、配られたりするわけですが、問題になるのが、「どこまで適用したっけ?」と、テーブル全体がどの状態なのかわからなくなるのです。
それを解決しようとするのが、データベースの状態をバージョン管理するFlywayです。
Flywayの基礎知識
Flyway はオープンソースのデータベースマイグレーションツール。Flyway を使うことで、データベースの状態をバージョン管理できるようになる。
FlywayをGradleプロジェクトに適用する
Flywayはgradleプラグインとして提供されているため、build.gradleのpluginsに以下を追加するだけ使えるようになります。
plugins {
id "org.flywaydb.flyway" version "7.5.2"
}
intelliJでbuild.gradleを開いて、そのままペーストしました。
右端の象さんマークを押すことで、変更が反映されるため、押します。
正常にbuild.gradleの変更が反映されると、Gradleタスクにflyway関係のタスクが追加されています。
試にこの時点で flywayInfo を実行しても、「Unable to connect to the database. Configure the url, user and password!」と表示されるだけですが、flywayが使えるようになったことは分かりますね。
データベースを作成する
MySQLであれば、インストール時に「MySQL 5.7 Command Line Client」が入っていると思います。プログラムメニューから探して起動しましょう。
mysql> create database sampledb;
mysql> create user 'springuser'@'%' identified by 'ThePassword'; -- Creates the
user
Query OK, 0 rows affected (0.26 sec)
mysql> grant all on sampledb.* to 'springuser'@'%'; -- Gives all privileges to
the new user on the newly created database
Query OK, 0 rows affected (0.00 sec)
これでデータベース(スキーマ)が作成されました。
この時点でflywayInfoを動かせるようにします。
build.gradleにflywayの接続先を設定します。(application.propertiesではありません)
flyway {
url = 'jdbc:mysql://localhost:3306/sampledb'
user = 'root'
password = 'rootpw'
schemas = ['sampledb']
}
これでflywayInfoを実行してみます。
BUILD SUCCESSFUL in 2s と表示されれば成功しています。
テーブルを作る
Create table文を作る
flywayInfoを実行したときに、ログに「Skipping filesystem location:D:\sample-project\sample-project-api\src\main\resources\db\migration (not found).」と出力されていますね。
その場所にディレクトリを作って、Create文やAlter table文を記載したSQLファイルを追加していきます。
SQLファイルの命名ルールは下記です。
- V<Version>__<Description>.sql
<Version>
は任意のバージョン番号…半角数値と、ドット.
またはアンダーバー_
の組み合わせで指定する。- <Description> は任意の説明文
例としてはこんな感じです。(チーム内で命名ルールを決めておきましょう。緩いルールで良いです。)
- 例1 V1__create_users.sql
- 例2 V1.0.1__alter_users_add_dept_id.sql
- 例3 V10.1__create_tables_dept_salary.sql
flywayMigrateを実行する
今回は users というテーブルを作ります。
sample-project-api\src\main\resources\db\migration にcreate table文を書きます。
CREATE TABLE USERS(
USER_ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT
, name VARCHAR (20)
, name_kana VARCHAR (20)
, age int
, enterAt date
);
Gradleタスクの flyway > flywayMigrate を実行します。
すると、SQLの中身が実行されます。
DBクライアントで確認すると、今回作りたかったusersテーブルとともに、flyway_schema_historyというテーブルが作成されました。これはflywayの実行履歴を管理するテーブルです。削除しないでください。
もし、flywayMigrateがうまくいかなければ、Gradleタスクの flyway > flywayRepairやflywayCleanを行ってからやり直してみてください。
この後、テーブルを追加したり、テーブル定義を変更するには、SQLファイルを作る→flywayMigrateを実行するの繰り返しでOKです。