TL;DR
supabase db pushの前に 必ず --dry-runを挟む - Dashboard で
直接変えた スキーマは supabase db pullでマイグレーションファイル 化してから 管理する supabase_migrations.schema_migrationsテーブルを把握していないと「push したのに 何も 変わらない」に 詰まる --include-allは最終手段。 普段使いすると 二重適用で 壊れる
Supabase を
転機は、supabase link して supabase db push をsupabase/migrations/ フォルダが
リモートの supabase_migrations.schema_migrations テーブルを
Supabase CLI のマイグレーション追跡の仕組み
Supabase CLI(安定版: v2.98.2)の
supabase/migrations/配下にタイムスタンプ 付きの SQL ファイルを 積み上げる supabase db pushはsupabase_migrations.schema_migrationsテーブルを参照し、 未適用の ファイルだけを 実行する
つまり、db push は
参照: Supabase — Managing database migrations
実際の運用フロー
既存プロジェクトを CLI 管理に移行する(初回のみ)
Dashboard でdb pull で
supabase link --project-ref <PROJECT_REF>
supabase db pull --schema public,auth
supabase/migrations/<timestamp>_remote_schema.sql が
新しいスキーマ変更を作る
変更は
supabase migration new add_profiles_bio
supabase/migrations/20260514120000_add_profiles_bio.sql が
ALTER TABLE public.profiles
ADD COLUMN IF NOT EXISTS bio text;
ローカルで確認してから push する
supabase db reset # ローカル DB にマイグレーションを全部当ててシードまで実行
ローカルで--dry-run を
supabase db push --dry-run
実際の
supabase db push
--linked(デフォルト)で--db-url で
はまりどころ:--include-all の落とし穴
supabase db push には --include-all というフラグが
supabase db push --include-all
supabase_migrations.schema_migrations に
一見、IF NOT EXISTS をIF NOT EXISTS を
--include-all は「supabase_migrations テーブル
db diff でスキーマ変更を自動検出する
「Dashboard でdb diff がある。
supabase db diff -f add_profiles_bio
ローカル DB と
まとめ
| 操作 | コマンド |
|---|---|
| 既存 | supabase db pull |
| 新しい | supabase migration new <name> |
| ローカル | supabase db reset |
| 本番 push 前の | supabase db push --dry-run |
| 本番 push | supabase db push |
Supabase CLI のsupabase_migrations.schema_migrations テーブルが