🛡️

Supabaseマイグレーションで失敗しないための安全対策

に公開

はじめに

Supabaseは素晴らしいBaaS(Backend as a Service)ですが、データベースマイグレーションで痛い目に遭った経験はありませんか?この記事では、実際の失敗事例から学んだSupabaseマイグレーションの安全対策をご紹介します。

最も危険な落とし穴:マイグレーションファイル名

問題発生例

# これが原因でシステム全体が破綻
20250924_add_feature.sql  ❌
20250925.sql              ❌

Supabase CLIはYYYYMMDDHHMMSS_description.sql形式を期待しています。形式が違うとマイグレーション履歴が破綻し、新しいマイグレーションが一切実行できなくなります。

正しいファイル名形式

# 正しい形式
20250925120000_add_todo_points.sql  ✅
20250925143000_create_user_levels.sql  ✅

安全なマイグレーション作成のベストプラクティス

1. 冪等性の確保

-- テーブル作成
CREATE TABLE IF NOT EXISTS public.new_table (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- カラム追加
ALTER TABLE public.existing_table 
ADD COLUMN IF NOT EXISTS new_column INTEGER DEFAULT 0;

-- ポリシー作成
DO $$ 
BEGIN
    IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE tablename = 'table_name' AND policyname = 'policy_name') THEN
        CREATE POLICY "policy_name" ON public.table_name
          FOR SELECT USING (auth.uid() = user_id);
    END IF;
END $$;

2. 安全なマイグレーション実行手順

# 1. マイグレーション作成(正しい形式で)
npx supabase migration new descriptive_name

# 2. 実行前チェック
npx supabase migration list
npx supabase status

# 3. 安全に適用
npx supabase db push

予防策:自動化で人的ミスを防ぐ

Pre-commitフック

#!/bin/sh
# .git/hooks/pre-commit
for file in supabase/migrations/*.sql; do
    filename=$(basename "$file")
    if ! echo "$filename" | grep -qE '^[0-9]{14}_[a-zA-Z0-9_]+\.sql$'; then
        echo "❌ 不正なマイグレーションファイル名: $filename"
        exit 1
    fi
done

安全なマイグレーション作成スクリプト

#!/bin/bash
# scripts/create-migration.sh
DESCRIPTION=$1
npx supabase migration new "$DESCRIPTION"
# テンプレート追加で安全なパターンを強制

まとめ

  • マイグレーションファイル名はYYYYMMDDHHMMSS_description.sql形式を厳守
  • IF NOT EXISTS等で冪等性を確保
  • 自動化ツールで人的ミスを防止
  • 実行前に必ず履歴確認

これらの対策により、安心してSupabaseマイグレーションを運用できます。一度システムが破綻すると復旧に時間がかかるため、予防が何より重要です。

Discussion