AI

DBマイグレーション比較:Flyway vs Liquibase vs Alembic でスキーマ変更を管理する

オープンソースラボ編集部2026年6月14日

DBマイグレーション比較:Flyway vs Liquibase vs Alembic でスキーマ変更を管理する

🔄 データベーススキーマの変更をバージョン管理するマイグレーションツール。Flyway・Liquibase・Alembicの特徴と選び方を解説します。

DBマイグレーションツールとは

SQLスキーマの変更(テーブル追加・カラム変更等)を番号付きスクリプトとして管理し、実行済み/未実行を追跡するツールです。チーム開発・本番デプロイに欠かせません。

主要ツール比較表

項目FlywayLiquibaseAlembic
ライセンスApache 2.0Apache 2.0MIT
言語JavaJavaPython
スクリプト形式SQL/JavaXML/YAML/JSON/SQLPython/SQL
自動スキーマ差分△(Pro版)
ロールバック
DB対応◎(30以上)◎(30以上)◎(SQLAlchemy対応)
フレームワーク統合Spring Boot ◎Spring Boot ◎FastAPI/Django ◎
設定ファイルTOML/confXML/YAMLalembic.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 BootFlyway
ロールバック・エンタープライズLiquibase
Python・SQLAlchemy・FastAPIAlembic

内部リンク

外部リソース

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版では差分自動検出・ドライラン・バックアップ等が追加されますが有料です。

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。