🛡️
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