Author

Web系ソフトウェアエンジニアを志望
開発記録や個人的な技術に対する思いを綴ります

FOCUS個人開発/設計
OSArch Linux+Omarchy
STACKTypeScript・Next.js
STATUS学習中 → 就活中

Dockerを使用したSupabase CLI・インテリセンスの設定方法

tech

はじめに

今回はDockerを使用したSupabase CLIの使用方法・インテリセンスの設定方法について解説していきます。

前回の記事で紹介したマイグレーションファイルの作成・リモートとの同期以外に、 Dockerを使用してローカルDBを立ち上げることでGUIでの操作やIDEでのインテリセンス・Lintの使用が可能になります。

Windows・Macの場合はDocker Desktopのインストール、Linuxの場合はDocker Engineのインストールで仮想環境の設定なく始められます。

Dockerを使用してSupabase CLIを使うことのメリット

  1. supabase startでローカルDBをGUIで操作・確認できる
  2. supabase db diff -f "filename"で変更内容をマイグレーションファイルにアウトプットできる
  3. DB情報と接続することでSQLの記述の際にインテリセンス・型補完...を使用できる

起動・終了方法

  • 起動方法
supabase start
╰> $ supabase start
WARNING: You are running different service versions locally than your linked project:
[+] Pulling 13/13
 ✔ pgmeta Skipped - Image is already present locally                                                                                                            0.0s
 ✔ vector Skipped - Image is already present locally                                                                                                            0.0s
 ✔ db Skipped - Image is already present locally                                                                                                                0.0s
 ✔ gateway Skipped - Image is already present locally                                                                                                           0.0s
 ✔ auth Skipped - Image is already present locally                                                                                                              0.0s
 ✔ studio Skipped - Image is already present locally                                                                                                            0.0s
 ✔ mailpit Skipped - Image is already present locally                                                                                                           0.0s
 ✔ imgProxy Skipped - Image is already present locally                                                                                                          0.0s
 ✔ analytics Skipped - Image is already present locally                                                                                                         0.0s
 ✔ api Skipped - Image is already present locally                                                                                                               0.0s
 ✔ realtime Skipped - Image is already present locally                                                                                                          0.0s
 ✔ storage Skipped - Image is already present locally                                                                                                           0.0s
 ✔ edgeRuntime Skipped - Image is already present locally                                                                                                       0.0s
Starting database from backup...
Starting containers...
Waiting for health checks...
Started supabase local development setup.

╭──────────────────────────────────────╮
│ 🔧 Development Tools                 │
├─────────┬────────────────────────────┤
│ Studio  │ http://127.0.0.1:54323     │
│ Mailpit │ http://127.0.0.1:54324     │
│ MCP     │ http://127.0.0.1:54321/mcp │
╰─────────┴────────────────────────────╯

*http://127.0.0.1:54323*をクリックすることでローカルホストのGUIに遷移します。

  • 終了方法
supabase stop

IDEでのインテリセンス使用方法

公式ページ

今回使用するLSPはSupabaseコミュニティが公開しているpostgres-language-serverです。

NeoVimでのインストール方法を解説します。 その他のIDEについては公式ガイドをもとにインストールしてください。設定方法は大きくは変わらないと思います。

LSPをインストールする

  1. Masonでインストール :MasonInstall postgres-language-server

  2. LSPを有効化する コンフィグファイルに以下を追加します。 LazyVimの場合はnvim/lua/plugins/lsp.luaです。(lsp.luaがなければ作成してください。)

    return {
    "neovim/nvim-lspconfig",
    opts = {
     vim.lsp.enable("postgres_lsp"),
    },
    }
    

    ※ この記述なしでも動作しますが、公式ガイドに記載があったため念の為設定しました。

コンフィグファイルを作成する

公式ガイド

プロジェクトルートにpostgres-language-server.jsoncを作成します。

{
  "$schema": "https://pg-language-server.com/latest/schema.json",
  "db": {
    "host": "127.0.0.1",
    "port": 54322, // supabase startのデフォルトDBポート
    "username": "postgres",
    "password": "postgres",
    "database": "postgres",
    "allowStatementExecutionsAgainst": ["127.0.0.1/*", "localhost/*"],
  },
  // フォーマット設定(保存時)
  "format": {
    "enabled": true,
    "lineWidth": 100,
    "indentSize": 2,
    "indentStyle": "tabs",
    "keywordCase": "upper", // CREATEなどキーワードの大文字(uppser)/小文字(lower)を設定
    "constantCase": "upper", // TRUEなど定数の大文字(uppser)/小文字(lower)を設定

    "typeCase": "lower", // textなどデータ型の大文字(uppser)/小文字(lower)を設定
  },
}

portのみ、supabase status/supabase startのDBのポートと合致していることを確認してください。

format以降は記述しなくても構いませんが、保存時に勝手に修正されて便利なのでおすすめです。

コマンド集

コマンド役割ユースケース
supabase startローカルDBを起動しGUI(Studio)を使用可能にする開発開始時、DBをローカルで確認しながら作業したいとき
supabase stopローカルDBを停止する開発を終える、または一時的にリソースを解放したいとき
supabase status起動中のローカル環境のURL・ポート情報を確認するStudioのURLやDBのポート番号を再確認したいとき
supabase db diff -f "filename"GUIやSQLでの変更内容をマイグレーションファイルとして出力するローカルDBの編集内容をマイグレーションファイルに起こしたいとき
supabase db resetmigrations/の内容をもとにDBを再構築するDBでの編集内容を取り消し、migrations通りの状態に戻したいとき

注意点

supabase db diffの挙動について

このコマンドはあくまで変更前と変更後の差分を比較して、変更後に到達するためのSQLを記述します。 そのため、同じカラム名を削除・再追加などした場合、データ型のキャストとして捉えられエラーが発生することがあります。 例えば、あやまってint8で設定したカラムをuuidに変更したい場合、当該カラムを削除して再作成する方法を取りましたが、この操作はsupabase db diff的にはint8からuuidへのキャストとして扱われます。

int8からuuidへのキャスト処理は存在しないため、DB上ではうまくいったにもかかわらずDB再構築時にエラーとなります。

こういった挙動を理解し、必要に応じて操作の分割・手動記述を組み合わせるのがキモになってきます。

正直なところ、普通に記述したほうが早いことも多いです。 例えば、テーブル名のリネームを行う場合、ALTER TABLE ... RENAME TO ...で済みますが、GUI経由で行うとDROP TABLE ...が記述されてしまいます。

さいごに

このプロジェクトでは難しそうだからつかわないでおこうと身構えてたところもありました。 でも使うにあたって必要なことはsupabase startだけ...

最初は、WebとCLIを行き来してましたが、結局ほとんどローカルだけで完結して作業するようになりました。 みなさんもsupabaseになれたら、supabase startを試してみてください!