Supabase

Supabase CLIを使用する

Supabaseは以前にリレーショナルDBを提供するサービスと紹介しました。

またSupabaseでは「Supabase CLI」というツールを提供しており、これを使用してローカルにSupabaseと同等の環境を構築したり、サーバー上のDBに対してマイグレーションはseedをすることができます。
今回はその辺りについてまとめていこうとします。

0. 環境

  • Mac 15.5
  • Homebrew 4.5.3
  • Supabase CLI 2.23.4

1. 「Ssupabase CLI」のインストール

Macの場合、「brew」を使用することですぐにインストールができます。

以下のコマンドで「brew」から「Supabase CLI」をインストールしましょう。

supabase login

2. ローカル環境の構築

Supabase CLIでログインする

それではローカルにSupabase環境を構築しましょう。
まず最初にSupabaseにログインします。
アクセストークンを取得するために、事前にSupabaseにログインした状態のブラウザをアクティブにしておいてください。
ターミナルを起動して以下のコマンドを入力します。

supabase login

すると以下のメッセージが表示されます。

Hello from Supabase! Press Enter to open browser and login automatically.

この段階でキーボードのエンターキーを押すと、ブラウザがアクティブになりコードが入力されます。
コードをコピーして「ターミナル」にペーストすることでログインができます。

Enter your verification code: XXXXXXXX
Token cli_shinyatomozumi@tomojuushinyanoMacBook-Pro-2.local_0000000000 created successfully.

これでログインが完了しました。

ローカルにSupabase環境を初期化する

以下のコマンドで初期化を実行します。

supabase init

以下の「VS Code」か「IntelliJ」の設定を生成するかの質問が出てきます。

Generate VS Code settings for Deno? [y/N] 
Generate IntelliJ Settings for Deno? [y/N] 

ここではどちらで使用しているかによって「y」を入力します。
ちなみにどちらを「n」にしてもSupabaseの初期化自体は行われます。
これは使用するIDEのプロジェクトテンプレートを作成するだけとなります。

インストールが完了すると以下のようなメッセージが表示されます。

Generated VS Code settings in .vscode/settings.json. Please install the recommended extension!
Finished supabase init.

ローカルのSupabase環境を起動する

以下のコマンド入力して、ローカルのSupabase環境を起動します。

supabase start

このコマンドによって、実際には以下のDockerイメージをPullしてDockerコンテナを起動しております。

  • supabase/postgres
  • supabase/realtime
  • supabase/storage-api
  • supabase/gotrue
  • supabase/logflare
  • supabase/vector
  • supabase/kong
  • supabase/mailpit
  • supabase/postgrest
  • supabase/edge-runtime
  • supabase/postgres-meta
  • supabase/studio

起動が完了すると、以下のサービス情報が表示されます。

         API URL: http://127.0.0.1:54321
     GraphQL URL: http://127.0.0.1:54321/graphql/v1
  S3 Storage URL: http://127.0.0.1:54321/storage/v1/s3
          DB URL: postgresql://postgres:postgres@127.0.0.1:54322/postgres
      Studio URL: http://127.0.0.1:54323
    Inbucket URL: http://127.0.0.1:54324
      JWT secret: super-secret-jwt-token-with-at-least-32-characters-long
        anon key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
service_role key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
   S3 Access Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
   S3 Secret Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
       S3 Region: local

これはローカルでSupabaseの各サービスが起動していることを示しています。
例えば「Studio URL」をブラウザで開くと、Supabaseの管理画面が表示されます。

http://127.0.0.1:54323

またデータベースでは上記の「DB URL」を元に接続するようになります。

DB Host127.0.0.1
DB Port54322
DB Namepostgres
DB Userpostgres
DB Passwordpostgres

ローカルのSupabase環境を終了する

以下のコマンドでローカルで起動しているSupabase環境を終了します。

supabase stop

ローカルのSupabase環境の情報を取得する

start時に表示された情報を再度確認したい場合は以下のコマンドとなります。

supabase status

2. Supabaseのマイグレーションとシード

「Supabase CLI」ではコマンドを使用して、マイグレーションとシードを行うことができます。

マイグレーションファイルの作成

マイグレーションファイルを作成するには、以下のコマンドを使用します。

supabase migration new create_users_table

このコマンドでは「create_users_table」という名前のマイグレーションファイルを作成します。
マイグレーションファイルは「supabase/migrations」ディレクトリに以下のような形で作成されます。

/supabase/migrations/YYYYMMDDHHMMSS_create_users_table.sql

上記のようにタイムスタンプと名前が付けられたSQLファイルが作成されます。
supabaseのマイグレーションは日付で管理されており、マイグレーションの順序はファイル名のタイムスタンプによって決まります。
以下のようにマイグレーションファイルを記述します。

/* Drop Tables */
DROP TABLE IF EXISTS USERS;

/* Create Tables */
CREATE TABLE USERS
(
    USER_ID UUID NOT NULL UNIQUE,
    NAME VARCHAR NOT NULL,
    EMAIL VARCHAR NOT NULL,
    CREATED_AT TIMESTAMP WITH TIME ZONE NOT NULL,
    UPDATED_AT TIMESTAMP WITH TIME ZONE NOT NULL,
    DELETED_AT TIMESTAMP WITH TIME ZONE,
    PRIMARY KEY (USER_ID)
) WITHOUT OIDS;


/* Comments */
COMMENT ON TABLE USERS IS 'ユーザー';
COMMENT ON COLUMN USERS.USER_ID IS 'ユーザーID';
COMMENT ON COLUMN USERS.NAME IS '名前';
COMMENT ON COLUMN USERS.EMAIL IS 'メールアドレス';
COMMENT ON COLUMN USERS.CREATED_AT IS '作成日時';
COMMENT ON COLUMN USERS.UPDATED_AT IS '更新日時';
COMMENT ON COLUMN USERS.DELETED_AT IS '削除日時';

上記SQLは以前にご紹介した「ERFlute」を使用してDDLを生成したものです。

マイグレーションの実行

マイグレーションを実行するには、以下のコマンドを使用します。

supabase db reset

このコマンドは未適用のマイグレーションをデータベースに適用します。
下記のように「pgadmin」で確認するとデータベースが作成されておりました。

またマイグレーションの実行履歴はデータベースの「supabase_migrations」schemaの「schema_migrations」テーブルに記録されます。
ここでの「version」と「name」から対応した項目と「statements」で対応した内容を確認することができます。

seedファイルの作成と適用

初期にいれるデータは「supabase/seed.sql」といったseedファイルで管理できます。

INSERT INTO
    public.users (user_id, name, email, created_at, updated_at)
    values
        ('20a37792-e4b6-0fb2-ef2b-65804b4486db', 'Kikuchi', 'sample-1@example.com', now(), now()),
        ('5b20492c-8e2f-098f-048e-aefe82c9789a', 'Arai', 'sample-2@example.com', now(), now()),
        ('02dd7c37-2f2d-749f-57f7-b0a00c5513c6', 'Yamamoto', 'sample-3@example.com', now(), now());

seed反映時のコマンドもマイグレーションと同様のコマンドとなります。

supabase db reset

実行後に反映されていることを確認します。

またseedの反映履歴は「supabase_migrations」schemeの「seed_files」テーブルに反映されます。

またseed反映するための対象となるファイルは「supabase」フォルダにある「config.toml」ファイルの以下の記述にある「sql_paths」の箇所のファイル名を変更します。

[db.seed]
# Specifies an ordered list of seed files to load during db reset.
# Supports glob patterns relative to supabase directory: "./seeds/*.sql"
sql_paths = ["./seed.sql"]

以下のように複数設定することも可能となります。

[db.seed]
# Specifies an ordered list of seed files to load during db reset.
# Supports glob patterns relative to supabase directory: "./seeds/*.sql"
sql_paths = ["./seed-sample1.sql", "./seed-sample2.sql"]

3. サーバーへの反映

最後にサーバー側にマイグレーションやdatabaseを反映します。
まずはログインした状態から以下のコマンドでデータベースにリンクしていることを確認します。

supabase link --project-ref [Project ID]

リンク確認時にデータベース作成時に設定したパスワードを確認されますので入力します。

プロジェクトIDの確認方法

Project ID」の記述場所は、Supabaseのダッシュボードの左メニューの「Project settings」を選択します。

そこから「General」の「Project Settings」に記述してあります。

サーバー側のデータベースに反映するためには以下のコマンドを入力します。

supabase db push

これでサーバー側にもデータベースが反映されました。
一旦今回はここまでとして、また認証やストレージ機能、実際にアプリプログラムからデータベースに接続する方法などを纏めていこうと思います。