Closed4

Supabase CLIでローカルデータベースを触る

masa5714masa5714

マイグレーションファイルを作成する

CLI
supabase db diff --use-migra -f 【任意の文字列】

これを実行すると、既に持っているマイグレーションファイルと現在のDB状況の差分を元にマイグレーションファイルを生成してくれる。

マイグレーションファイルとは、テーブル構造を持つだけで、レコード自体は持たない。あくまで構造だけをチーム間で共有できる状態になるということ。テーブルの構造の変更履歴をファイル化してくれているようなイメージ。開発が進むとファイル数が増えてしまうのはデフォらしいので気にする必要は無い模様。

実践

こんな感じのテーブルを作成し、 supabase db diff --use-migra -f public_schema を実行する。

supabase/migrationsディレクトリ内に下記のマイグレーションファイルが生成された。

20231012142126_public_schema.sql
create table "public"."profiles" (
    "id" bigint generated by default as identity not null,
    "name" text,
    "created_at" timestamp with time zone not null default now()
);


alter table "public"."profiles" enable row level security;

CREATE UNIQUE INDEX profiles_pkey ON public.profiles USING btree (id);

alter table "public"."profiles" add constraint "profiles_pkey" PRIMARY KEY using index "profiles_pkey";

次に、先程作ったテーブルに description というカラムを追加してみることにする。

そして、同様に supabase db diff --use-migra -f public_schema を実行する。

20231012142402_public_schema.sql
alter table "public"."profiles" add column "description" text;

また新しくマイグレーションファイルが生成されるが、今度は記述が短い。
descriptionカラムが追加されたことを検出し、その差分を出力してくれている。

マイグレーションファイルを1つにまとめる

https://supabase.com/docs/reference/cli/supabase-migration-squash

上記のようにマイグレーションをしまくると、ファイルがかなり増えてしまう。
それぞれのタイミングの作業履歴が分かってとても良いが、1つにまとめたくなるだろう。

そんなとき用のコマンドも用意されている。

CLI
supabase migration squash --local

Windows11環境では上記のコマンドが動かなかった。下記にしたらなぜか動いた

CLI
supabase migration squash --local -p postgres --debug

--debugを付けたら動いたんご...。

これでローカルのマイグレーションファイルをまとめてくれる。
ただし、天才AIのBardさん曰くマイグレーションファイルをまとめるのはあまりオススメしないとのことでした。

Claudeさん的には一人で開発しているのであれば実行してもいいよ、とのことでした。

masa5714masa5714

データベースの中身を削除してテーブル構造だけ復元する

ゴミのレコードが溜まってしまい邪魔になったら下記を実行すると良い。

CLI
supabase db reset

実行することで、データベースのデータを削除し、マイグレーションファイルを元にテーブルを再構築してくれる。余計なデータが消えてくれるので、やり直しがしやすい。

実践

supabase db reset を実行すると、データベースを削除した後、マイグレーションファイルを元にテーブル構造を復元してくれる。

このようにテーブル構造だけが保持され、レコードは削除されている。

masa5714masa5714

レコードをSQLファイルとして保存する

ローカル環境でデータを構築していて、後から作業を再開したいときには、
念のためSQLファイルとして保存しておいた方が安心感がある。

CLI
supabase db dump --local --data-only -f seed.sql

seed.sql という名前にしたが、これは何でも良い。
ダンプしたデータを supabase db reset のタイミングで自動で復元するために seed.sql という名前にしている。

masa5714masa5714

dump したデータを supabase db reset のタイミングで復元するには?

supabase db reset ではテーブル構造だけが復元された。
レコード内容も一緒に復元する方法も用意されている。

supabase/seed.sql というファイルがあるが、これが復元の際にDBに対して実行されるSQLファイル。つまり、ここに INSERT 文などを用意してやれば、そのデータを勝手に入れてくれる。

そこで、上のdumpの例として seed.sql として出力したのだ。

既に存在するseed.sqlを上書きする形で移動させておき、 supabase db reset を実行すれば、マイグレーションファイルが実行された後、seed.sqlが実行され、テーブル構造+レコードが復元されるという仕組みだ。

このスクラップは2ヶ月前にクローズされました