こんにちは。 pregum_foxです。 また技術書典などのイベントが近づいているので、目当ての本を探しつつ最近の楽しみにしています。
今回はSupabase CLIを使って、ローカル環境をリモートからpullしようとsupabase db pull
コマンドを叩いた時にエラーが出た時の対処法について記載していきます。
問題概要
開発で使用しているローカル環境のSupabaseプロジェクトのDBを変更した後、リモート環境で別の変更を加えた後にsupabase db pull
を叩いた時にエラーが出ました。
原因
ローカル環境とリモート環境のマイグレーションの同期が取れていないことが原因でした。
対応内容
上記の問題を解消するために対応内容について記載します。
前提条件
まずは前提として以下の項目を満たしていることを確認します。
- [x] Dockerが起動していること
- Dockerが起動していないと
supabase
コマンドが動作しませんでした
- Dockerが起動していないと
- [x]
supabase login
コマンドでログインできていること - [x]
supabase link
コマンドでpullしたい対象のプロジェクトへリンクできていること - [x]
supabase status
コマンドでローカル環境のSupabaseプロジェクトの情報が表示されること- こちらはもしかすると不要かもです
エラー内容と対処法
片方のみに反映されているマイグレーションファイルは見当たらなかったので、もう少し調べました。
その結果、リモート側の変更がローカルにすでにその変更が含まれているためにエラーが出ていることがわかりました。(スクショ時にはすでにマイグレーションファイルを削除した後だったので、後付けしております)
ローカル側の変更を削除
ローカルとリモートの差異を解消するため、ローカル環境にある不要なマイグレーションファイルを削除しました。例として、
20240917140424_~
のマイグレーションファイルを削除しました。
この時点でsupabase migration list
を叩くと以下のようにローカル環境の欄が空になっていることが確認できます。
- リモートを適用前にマーク
削除後、supabase migration repair --status reverted <マイグレーション日付>
コマンドを使って、リモートの最新マイグレーションを適用前にマークしました。
ここでは、supabase migration repiar --status reverted 20240917140424
というコマンドを叩きました。
このコマンドにより、supabase migration list
の結果からも該当マイグレーションが消えることが確認できました。
- リモートデータを再取得
上記の設定後にsupabase db pull
を再実行し、リモートデータの取得が正常に完了しました。
この際、「remote_schema」マイグレーションファイルを保存するかどうか尋ねられるため、保存する選択を行いました。
上記で保存しなくともリモート環境には保存されている為、特別な理由がない限りは保存する選択をおすすめします。
リモート環境のマイグレーション履歴はSupabaseのDatabase > PLATFORM > Migrations から確認できます。
上記で無事リモート環境とローカル環境のマイグレーションが同期され、supabase db pull
が動作するようになりました。
お疲れ様でした。
雑感
開発時はGUIでぽちぽちできるのですごい楽なのですが、いざローカル環境を整えて開発しようとするとよくDB関連の問題に遭遇し、その度に時間を浪費することがあったので、頻発するdb pullについてのエラー対処法を備忘録として残しました。 他にもマイグレーション方法などローカル環境で作成したfunctionをリモート環境へpushする方法など記事をそのうちまとめたいなと考えています。 ここまで読んでいただきありがとうございました。
参考サイト
https://supabase.com/docs/reference/cli/supabase-migration-repair