DBマイグレーション比較:Flyway vs Liquibase vs Alembic でスキーマ変更を管理する
オープンソースラボ編集部 ・ 2026年6月14日
DBマイグレーション比較:Flyway vs Liquibase vs Alembic でスキーマ変更を管理する
🔄 データベーススキーマの変更をバージョン管理するマイグレーションツール。Flyway・Liquibase・Alembicの特徴と選び方を解説します。
DBマイグレーションツールとは
SQLスキーマの変更(テーブル追加・カラム変更等)を番号付きスクリプトとして管理し、実行済み/未実行を追跡するツールです。チーム開発・本番デプロイに欠かせません。
主要ツール比較表
| 項目 | Flyway | Liquibase | Alembic |
|---|---|---|---|
| ライセンス | Apache 2.0 | Apache 2.0 | MIT |
| 言語 | Java | Java | Python |
| スクリプト形式 | SQL/Java | XML/YAML/JSON/SQL | Python/SQL |
| 自動スキーマ差分 | △(Pro版) | ◎ | ◎ |
| ロールバック | △ | ◎ | ◎ |
| DB対応 | ◎(30以上) | ◎(30以上) | ◎(SQLAlchemy対応) |
| フレームワーク統合 | Spring Boot ◎ | Spring Boot ◎ | FastAPI/Django ◎ |
| 設定ファイル | TOML/conf | XML/YAML | alembic.ini |
各ツールの特徴
Flyway
シンプルさを重視したJavaベースのマイグレーションツール。SQLファイルに番号を付けるだけで使えるため、学習コストが非常に低いです。
主な特徴:
- バージョン番号付きSQLファイルを順番に実行するだけ
- チェックサムで変更を検出(変更済みSQLを上書き不可)
- Spring Boot自動統合(
spring.flyway.enabled=true) - Docker・CLI・Java APIで使用可能
-- V1__create_users_table.sql
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
name VARCHAR(255) NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- V2__add_users_role.sql
ALTER TABLE users ADD COLUMN role VARCHAR(50) DEFAULT 'user';
CREATE INDEX idx_users_role ON users(role);
-- V3__create_articles_table.sql
CREATE TABLE articles (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
title VARCHAR(500) NOT NULL,
slug VARCHAR(255) UNIQUE NOT NULL,
user_id BIGINT REFERENCES users(id),
published_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW()
);
# CLIで実行
flyway -url=jdbc:postgresql://localhost:5432/mydb -user=postgres -password=secret -locations=filesystem:./migrations migrate
# 確認
flyway info
向いているケース: シンプルなSQL管理・Spring Boot・初心者
Liquibase
XML/YAML/JSONでマイグレーションを記述し、強力なロールバックと差分自動検出が特徴。エンタープライズ向けの高度な機能を持ちます。
主な特徴:
- changeSetによるロールバックの自動定義
- generateChangeLog でDBから差分を自動抽出
- Preconditions(事前条件チェック)で安全なマイグレーション
- ContextとLabelsで環境別に適用を制御
# changelog.yaml
databaseChangeLog:
- changeSet:
id: 1
author: dev
changes:
- createTable:
tableName: users
columns:
- column:
name: id
type: bigserial
constraints:
primaryKey: true
- column:
name: email
type: varchar(255)
constraints:
nullable: false
unique: true
- column:
name: name
type: varchar(255)
constraints:
nullable: false
rollback:
- dropTable:
tableName: users
- changeSet:
id: 2
author: dev
context: "!test" # テスト環境では実行しない
changes:
- addColumn:
tableName: users
columns:
- column:
name: role
type: varchar(50)
defaultValue: "user"
# マイグレーション実行
liquibase --changeLogFile=changelog.yaml --url=jdbc:postgresql://localhost:5432/mydb --username=postgres --password=secret update
# ロールバック(1件戻す)
liquibase rollbackCount 1
向いているケース: ロールバック必須・複数DB環境・エンタープライズ
Alembic
SQLAlchemyのマイグレーションツール。PythonでマイグレーションロジックをORMと組み合わせて書けます。FastAPI・Flaskとの相性が抜群です。
主な特徴:
- SQLAlchemyと完全統合(ORMのモデルから差分を自動生成)
alembic revision --autogenerateでモデル変更を自動検出- ブランチ(頭分かれ)に対応したマイグレーション管理
- async対応(asyncpg等のAsync Driver)
# alembic/env.py(設定)
from sqlalchemy import create_engine
from myapp.models import Base
target_metadata = Base.metadata
# alembic/versions/001_create_users.py(自動生成例)
'''create users table
Revision ID: abc123
Down revision: None
'''
from alembic import op
import sqlalchemy as sa
def upgrade():
op.create_table(
'users',
sa.Column('id', sa.BigInteger(), autoincrement=True, nullable=False),
sa.Column('email', sa.String(255), nullable=False),
sa.Column('name', sa.String(255), nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.func.now()),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('email'),
)
def downgrade():
op.drop_table('users')
# モデル変更から自動でマイグレーションを生成
alembic revision --autogenerate -m "add users role column"
# 適用
alembic upgrade head
# ダウングレード(1件戻す)
alembic downgrade -1
向いているケース: PythonプロジェクトでSQLAlchemy使用・FastAPI/Django
選択ガイド
| 状況 | 推奨 |
|---|---|
| シンプルSQL管理・Java/Spring Boot | Flyway |
| ロールバック・エンタープライズ | Liquibase |
| Python・SQLAlchemy・FastAPI | Alembic |
内部リンク
外部リソース
FAQ
Q. Prisma MigrateやTypeORMのマイグレーションとの違いは何ですか?
PrismaはORMに組み込まれたマイグレーション機能で、schema.prismaファイルから自動生成します。Flyway/LiquibaseはORM非依存でJavaでも使えます。
Q. 本番環境でのマイグレーション実行は怖いですが、安全に進めるには?
まず--dry-runフラグ(Flyway: dryRunOutput、Liquibase: --show-summary)で実行内容を確認してから本番を実行してください。
Q. ダウンタイムなしのカラム追加はどうやりますか?
PostgreSQLはDEFAULTなしのカラム追加はロック不要です。Liquibase/AlembicでNOT NULL DEFAULTを付ける場合は、追加→バックフィル→NOT NULL追加の3ステップが推奨されます。
Q. FlywayCommunityとFlywayTeams(旧Pro)の違いは何ですか?
CommunityはOSSで基本機能は無料。Teams版では差分自動検出・ドライラン・バックアップ等が追加されますが有料です。