こんにちは。エンジニア研修中の IT 初心者です。今回は研修や個人開発で学んだ Flyway についてまとめます。
データベースのバージョン管理は初心者にとって理解しにくい部分ですが、Flywayを使うと「コードのようにDBを管理できる」ようになり、とても便利だと感じました。
Flywayとは?
Flyway は データベースのマイグレーションツール です。
「DBスキーマをいつ、誰が、どのように変更したか」をバージョン管理できる仕組みを提供します。
- SQLファイルやJavaで定義したマイグレーションを順番に適用していく
- 変更の履歴はデータベースの専用テーブル(
flyway_schema_history)に記録される - CI/CDやチーム開発で「環境差異」を防ぎやすくなる
つまり、Flywayは「アプリのソースコード管理のGit」に近い役割を、DBに対して担ってくれるものです。
なぜ必要なのか?
初心者の頃は「ALTER TABLEを直接叩けばよくない?」と思っていました。ですが、実際の開発では以下の問題が発生します。
- 複数人で作業していると、誰がどんなSQLを流したのか分からなくなる
- 本番環境とローカル環境でスキーマがずれる
- リリースごとのDB変更が手作業で属人化してしまう
Flywayを使うと、マイグレーションをコード化して全員で共有できるので、上記の課題を解消できます。
Flywayの基本構成
Flywayでは「マイグレーションファイル」を用意して、それを順番に適用します。
-
ファイル名のルール:
V{番号}__{説明}.sql - 例:
-- V1__create_users_table.sql
CREATE TABLE users (
id BIGINT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL
);
-- V2__add_posts_table.sql
CREATE TABLE posts (
id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
body TEXT,
FOREIGN KEY (user_id) REFERENCES users(id)
);
FlywayはV1, V2…の番号を見て、未適用のものを順に実行していきます。
実行方法
コマンドラインから使う場合
flyway migrate
これで resources/db/migration に置かれたSQLが順番に実行されます。
Spring Bootとの組み合わせ
Spring Bootに flyway-core を依存関係として追加すると、アプリ起動時に自動でマイグレーションが走ります。
<!-- build.gradleやpom.xmlに追加 -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
Rollbackはどうする?
Flyway自体には「自動で元に戻す」機能はありません。
代わりに、**「戻したいとき用の逆マイグレーションファイル」**を自分で作る運用が推奨されています。
例:
-
V3__add_age_column.sqlで age を追加 - 戻したいなら
U3__remove_age_column.sqlを用意して明示的に実行
初心者的には「え、手で戻すの?」と思いましたが、これは DB変更は不可逆が基本 という考え方に基づいています。
よく使うコマンド
flyway info # 適用済み/未適用のマイグレーション確認
flyway validate # ファイルとDBの整合性をチェック
flyway clean # DBを全部初期化(開発中のみ推奨)
特に info は頻繁に使います。自分のローカルがどこまで反映されているか一目で分かります。
研修・個人開発での学び
実際にFlywayを導入してみて気づいたこと:
-
環境差異がなくなる安心感
「本番とローカルでテーブルが違う」という事故がなくなった。 -
チーム開発でのスピードアップ
新人でも「SQLファイル置いて migrate すればOK」と分かりやすい。 -
命名規則の大切さ
ファイル名に説明を入れておくと、後で見返したときに理解しやすい。 -
Rollback戦略の重要性
戻せない前提で「本当に必要な変更か」を慎重に考える習慣がついた。
まとめ
Flywayを使うと、DBの変更を 安全・共有可能・履歴付き で扱えるようになります。
SQLをファイルにしてGitで管理できるので、アプリのコードと一緒にレビューできる点が特に便利です。
初心者目線では「最初はちょっと面倒そう」に見えましたが、使ってみると トラブルを減らす保険 になると強く感じました。
今後は CI/CD パイプラインに組み込んで、自動デプロイと一緒にDBマイグレーションも流す練習をしていきたいです。