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": "修正案"}}
"""
よくある失敗と対策
| 失敗 | 原因 | 対策 |
|---|---|---|
| 本番でロック長時間 | 大テーブルのALTER | pt-online-schema-changeの使用 |
| ロールバック不可 | DOWNスクリプト未作成 | 生成時に必須化 |
| データ消失 | DROP COLUMNの即実行 | 2段階削除(非推奨化->次回削除) |
| アプリ障害 | スキーマとコードの不整合 | デプロイ順序の管理 |
まとめ
AIによるマイグレーション自動化は「生成 + 安全チェック + 段階適用」の3ステップで構成する。特に安全チェックの自動化が重要で、人間の見落としを防ぎつつ、マイグレーション作業の工数を大幅に削減できる。
関連記事
A
Agentive 編集部
AIエージェントを実際に使い倒す個人開発者。サイト制作の自動化を実践しながら、その知見を発信しています。