Flywayを試す
昨年、Laravelを使ったプロジェクトのヘルプに入った。
Laravelに触れた結果として、データベースマイグレーションツールの魅力を再認識した。
自分がデータベースマイグレーションツールを最初に触ったのは、RailsのActive Recordのマイグレーションだったと思うが、当時はそこまで便利だとは思わなかった。Laravelに触れて、ああ、なるほど、と思うところがあった。
最近、私は記憶力が低下してきており、複数の仕事を同時に進めると、すぐに何をしていたのか思い出せなくなり、前回の仕事のおさらいを何度もする羽目になっている。それで作業メモを作りまくっているのだが、結果として、似たようなメモを繰り返し書いていることに気付く。
データベース上のテーブルの定義やテストデータの挿入についても似たようなことがあり、あるプロジェクトの仕事を少しずつ、コツコツと進める必要があるとき、しかも、移動先ではノートPCで作業し、自宅ではデスクトップPCで作業したい、というような要請もあって、リモートレポジトリにファイルを置いて、その履歴を見ることで、それまでの作業を複数の環境でリワインドできるようにしたいのである。
データベースマイグレーションツールは、まさにその目的にピッタリである。複数人で作業できる、ということは、自分が忘れっぽかったり、複数の環境を使っていることと、同じことである。
前置きが長くなった。
私は、現在、2年近くゆっくり取り組んでいるプロジェクトがあり、今度こそ、ちゃんと完結させたいと思っている。着実に前進させるために、ここでデータベースマイグレーションツールを導入したい。そのプロジェクトはJavaで書いているので、データベースマイグレーションツールもJavaで動くものにしたい。
そういうわけでざっと検索したところ、Flywayというものが良さそうだったので、Flywayを試すことにしたのである。
参考にしたページは、以下である。
少し古いページなので、参考にしつつも、現在最新の情報を参照しながら進めることにする。
まずは公式ページをチェックする。
私のプロジェクトはNinja Frameworkを使っていて、こいつはMavenを使うのが基本なので(Gradleは、私が試したときは、まだまともに動かなかった...今はどうだか知らない)、FlywayもMavenから使う方法を試すことにする。
いきなり本番プロジェクトを使うのは厳しいので、練習用のプロジェクトをBitbucketに作る。
mvn archetype:generate -B \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DarchetypeVersion=1.1 \ -DgroupId=com.tmiyapub \ -DartifactId=my-first-flyway \ -Dversion=1.0-SNAPSHOT \ -Dpackage=com.tmiyapub.lesson.flyway
Flywayのチュートリアルでは、h2を使う場合の例が示されているが、われわれはPostgreSQLを使うので、そのための修正をpom.xmlに施そう。
<build> <plugins> <plugin> <groupId>org.flywaydb</groupId> <artifactId>flyway-maven-plugin</artifactId> <version>5.2.4</version> <configuration> <driver>org.postgresql.Driver</driver> <url>jdbc:postgresql://localhost:5432/flyway</url> <user>flyway</user> <password>flyway</password> </configuration> </plugin> </plugins> </build>
ここで注意したいのは、Flywayのチュートリアルではなかった<driver>を指定することである。また、実際に使うドライバは<dependencies>の方に入れておく。
pom.xmlを修正し、src/main/resources/db/migrationにV1__create_person_table.sqlを作成する。
CREATE TABLE person ( id INT PRIMARY KEY, name VARCHAR(100) NOT NULL );
そしてmvn flyway:migrateでテーブルの作成が行なわれる。
カラムを追加したい場合には、src/main/resources/db/migrationにV2__alter_person_table.sqlを作成して、mvn flyway:migrateする。
ALTER TABLE person ADD COLUMN memo VARCHAR(255);
つまり、V1から順番にファイルを作っていくことで、各ファイル内のクエリが1回だけ実行される仕組みとなる。V数字の後にアンダースコアを2つ置くことが大事である。
Flywayならではの機能があるのかも知れないが、今のところ知る必要がないので、ここまでの知識で実際の仕事に適用しようと思う。