Agentive
自動化ラボ

AIでデータベースマイグレーション自動化 — スキーマ変更を安全に

約5分で読めます

AIでDBマイグレーション自動化

データベースのスキーマ変更は最もリスクの高い運用作業の一つだ。AIを活用することで、マイグレーションファイルの自動生成、安全チェック、ロールバックスクリプトの同時作成を実現できる。

マイグレーション自動生成のプロンプト

MIGRATION_PROMPT = """
以下の要件に基づいてSQLマイグレーションファイルを生成してください。

## 現在のスキーマ
{current_schema}

## 変更要件
{requirements}

## 出力ルール
1. UP(適用)とDOWN(ロールバック)の両方を必ず含める
2. データ損失が発生する操作にはコメントで警告を付ける
3. 大量データのテーブルにはバッチ処理を適用する
4. インデックス追加はCONCURRENTLYオプションを使用する
5. NOT NULL制約の追加はデフォルト値を先に設定してから行う

## 出力形式
-- Migration: {migration_name}
-- Created: {timestamp}
-- Description: {description}

-- ========== UP ==========
BEGIN;
-- SQL statements here
COMMIT;

-- ========== DOWN ==========
BEGIN;
-- Rollback SQL statements here
COMMIT;
"""

安全チェックリスト

AIが生成したマイグレーションを実行前に自動検証する。

import re

class MigrationSafetyChecker:
    DANGEROUS_PATTERNS = [
        (r"DROP\s+TABLE", "テーブル削除", "HIGH"),
        (r"DROP\s+COLUMN", "カラム削除(データ損失)", "HIGH"),
        (r"TRUNCATE", "全データ削除", "HIGH"),
        (r"ALTER\s+.*\s+TYPE", "型変更(データ変換失敗リスク)", "MEDIUM"),
        (r"NOT\s+NULL(?!\s+DEFAULT)", "NOT NULL追加(デフォルト値なし)", "MEDIUM"),
        (r"DROP\s+INDEX", "インデックス削除(性能劣化リスク)", "LOW"),
    ]

    def check(self, sql: str) -> list[dict]:
        """マイグレーションSQLの安全性をチェック"""
        warnings = []
        for pattern, desc, risk in self.DANGEROUS_PATTERNS:
            if re.search(pattern, sql, re.IGNORECASE):
                warnings.append({
                    "pattern": desc,
                    "risk": risk,
                    "action": "BLOCK" if risk == "HIGH" else "WARN"
                })
        if "DOWN" not in sql and "ROLLBACK" not in sql.upper():
            warnings.append({
                "pattern": "ロールバックスクリプトが存在しない",
                "risk": "HIGH",
                "action": "BLOCK"
            })
        return warnings

段階的適用フロー

マイグレーションは一気に本番適用せず、段階的に進める。

1. AI生成 -> マイグレーションSQL作成
2. 安全チェック -> 危険パターンの自動検出
3. ドライラン -> テストDBで実行、結果を検証
4. ステージング適用 -> ステージング環境で動作確認
5. 本番適用 -> 承認後に実行
6. 検証 -> スキーマ整合性・アプリ動作確認
7. ロールバック判定 -> 問題あればDOWNスクリプト実行
def apply_migration(migration_sql: str, env: str = "test"):
    """段階的にマイグレーションを適用"""
    checker = MigrationSafetyChecker()
    warnings = checker.check(migration_sql)

    high_risks = [w for w in warnings if w["action"] == "BLOCK"]
    if high_risks:
        raise MigrationBlockedError(
            f"危険な操作を検出: {high_risks}。手動確認が必要です。"
        )

    if env == "test":
        result = execute_on_test_db(migration_sql)
        verify_schema_integrity(result)
    elif env == "staging":
        result = execute_on_staging(migration_sql)
        run_integration_tests()
    elif env == "production":
        if not get_approval("本番マイグレーション実行の承認"):
            raise ApprovalRequiredError()
        result = execute_on_production(migration_sql)
        monitor_for_errors(duration_minutes=30)

ロールバック戦略

すべてのマイグレーションにはロールバックスクリプトを同梱する。AIに生成させる際は、UPとDOWNの整合性を検証する追加プロンプトを実行する。

ROLLBACK_VERIFY_PROMPT = """
以下のUP/DOWNマイグレーションの整合性を検証してください。

UP実行後にDOWNを実行した場合、元のスキーマに完全に戻りますか?
戻らない場合、何が失われますか?

UP:
{up_sql}

DOWN:
{down_sql}

JSON形式で回答:
{{"reversible": true/false, "data_loss": ["失われるもの"], "fix": "修正案"}}
"""

よくある失敗と対策

失敗原因対策
本番でロック長時間大テーブルのALTERpt-online-schema-changeの使用
ロールバック不可DOWNスクリプト未作成生成時に必須化
データ消失DROP COLUMNの即実行2段階削除(非推奨化->次回削除)
アプリ障害スキーマとコードの不整合デプロイ順序の管理

まとめ

AIによるマイグレーション自動化は「生成 + 安全チェック + 段階適用」の3ステップで構成する。特に安全チェックの自動化が重要で、人間の見落としを防ぎつつ、マイグレーション作業の工数を大幅に削減できる。

関連記事

A

Agentive 編集部

AIエージェントを実際に使い倒す個人開発者。サイト制作の自動化を実践しながら、その知見を発信しています。