mcpField
S
supabase-schema-from-requirements

supabase-schema-from-requirements

github.com/jeremylongshoreデータ・データベース2.9k41 回インストール2 日前に更新
リポジトリ

supabase-schema-from-requirements について

ビジネス要件をSupabase上のPostgresスキーマに変換し、マイグレーションの作成から適用まで支援するスキルです。RLSポリシー、インデックス、タイムスタンプトリガー、TypeScript型も生成し、Supabaseアプリの開発者を対象としています。

主な機能

  1. 01要件からエンティティと関係を抽出
  2. 02テーブル、制約、インデックスの作成
  3. 03RLSポリシーとヘルパー関数の作成
  4. 04データベースマイグレーションの適用
  5. 05TypeScript型の生成

活用シーン

  1. 01製品要件に基づくスキーマ設計
  2. 02クライアント操作向けRLS権限の設定
  3. 03ローカルまたはリモートプロジェクトへのマイグレーション適用
  4. 04型安全なSupabaseクエリ用の型生成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jeremylongshore/tons-of-skills-marketplace --skill supabase-schema-from-requirements

インストール後、Claude Code で/supabase-schema-from-requirementsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
rls-policies.md
typescript-client.md
worked-schema-examples.md

詳細

要件からSupabaseスキーマを作成する

概要

ビジネス要件を、Supabase内で本番環境に対応したPostgresスキーマへ変換します。仕様策定からマイグレーションの適用までの全工程を対象とし、エンティティの抽出、適切な型と制約を備えたテーブル、Row Level Securityポリシー、パフォーマンスインデックス、タイムスタンプトリガー、TypeScript型の生成を行います。これを早い段階で適切に行うことが重要です。後続のすべての機能(認証、ストレージ、リアルタイム、エッジ関数)は、適切に設計されたテーブルに依存するためです。

前提条件

  • Supabase CLIがインストールされ、プロジェクトにリンクされていること(npm install -g supabase、supabase link)
  • プロジェクトに@supabase/supabase-js v2+がインストールされていること
  • エンティティとアクセスルールを特定したビジネス要件、PRD、または仕様書
  • ローカルのSupabaseが起動している(supabase start)か、リンク済みのリモートプロジェクトがあること

手順

ステップ1:要件を解析してマイグレーションを作成する

要件書を読み、エンティティ、属性、リレーションシップ、アクセス制御ルールを抽出します。各エンティティをPostgresのテーブルに対応付けます。

エンティティ抽出の例(プロジェクト管理アプリ):

エンティティ主なカラムリレーションシップ
組織name、slug、plan複数のプロジェクトと複数のメンバーを持つ
プロジェクトname、description、status組織に属し、複数のタスクを持つ
タスクtitle、priority、status、due_dateプロジェクトに属し、ユーザーに割り当てられる
メンバーrole(owner/admin/member)ユーザーと組織をつなぐ中間テーブル

マイグレーションファイルを作成します。

npx supabase migration new create_tables
# Creates: supabase/migrations/TIMESTAMP_create_tables.sql

標準的なPostgresデータ型(uuid、text、integer、boolean、timestamptz、jsonb)を使用して、マイグレーションSQLを記述します。 完全なマイグレーション例(プロジェクト管理アプリ:テーブル、外部キー、インデックス、moddatetimeトリガー)については、references/worked-schema-examples.mdを参照してください。

データ型の選択ガイド:

用途型備考
主キーuuid常にuuid_generate_v4()をデフォルト値に設定します
名前、タイトルtextPostgresではvarcharよりもこちらを推奨します
件数、順位integerシーケンスにはbigintを使用します
フラグbooleanデフォルト値にtrueまたはfalseを明示的に設定します
タイムスタンプtimestamptzタイムゾーンなしのtimestampは使用しないでください
柔軟なデータjsonbクエリ可能なJSONです。設定やメタデータに使用します
リストtext[]シンプルなタグやラベルにはPostgresの配列を使用します
ステップ2:Row Level Securityポリシーを追加する

クライアントに公開するすべてのテーブルでRLSを有効にする必要があります。まず再利用可能なsecurity definerヘルパー関数を記述し、次にそれらを呼び出すテーブルごとのポリシーを記述します。1つのテーブルに対するひな形は次のとおりです。

alter table public.organizations enable row level security;

create policy "Users read own orgs"
  on public.organizations for select
  using (public.is_org_member(id));

完全なポリシー一式(is_org_member/is_org_adminヘルパー関数と、組織、メンバー、プロジェクト、タスクに対するすべてのselect/insert/update/deleteポリシー)については、references/rls-policies.mdを参照してください。ポリシー名は、対象者とアクションが分かるようにします("Admins manage members"、"Assignee updates tasks")。

ステップ3:マイグレーションを適用して型を生成する
# Apply migration locally
npx supabase db reset

# Or push to a linked remote project
npx supabase db push

# Generate TypeScript types from the live schema
npx supabase gen types typescript --local > types/supabase.ts

生成されたDatabase型をcreateClientのジェネリック型パラメーターとして渡し(import type { Database } from './types/supabase'を参照)、すべてのクエリでエンドツーエンドの型安全性を確保します。型付きの挿入、外部キー結合、複数テーブルのネストされた結合、RLSの適用確認を含む、型付きクライアントの完全な手順については、references/typescript-client.mdを参照してください。

出力

  • すべてのテーブル、制約、インデックスを含む、supabase/migrations/配下のSQLマイグレーションファイル
  • 要件のアクセス制御ルールに対応するRLSポリシー
  • 再利用可能な認可チェック用のヘルパー関数(is_org_member、is_org_admin)
  • updated_atを自動管理するmoddatetimeトリガー
  • 型安全なクライアントクエリのためにtypes/supabase.tsに生成されたTypeScript型
  • 頻繁に絞り込みに使われるカラム(status、due_date)に対する部分インデックス

エラー処理

エラー原因解決策
42P07: relation already existsマイグレーションでテーブル名が衝突していますcreate table if not exists を使用するか、テーブル名を変更します
23503: foreign key violation存在しない親行を参照して挿入しています先に親行を挿入するか、UUID を確認します
42501: insufficient privilegeRLS ヘルパー関数の権限が不足しています関数定義に security definer を追加します
42883: function uuid_generate_v4() does not exist拡張機能が有効になっていませんcreate extension if not exists "uuid-ossp" を追加します
supabase db push は成功するものの、テーブルが見つかりませんマイグレーションがすでに記録されていますsupabase_migrations.schema_migrations を確認して修復します
PGRST204: column not foundTypeScript の型が同期されていませんnpx supabase gen types typescript --local > types/supabase.ts を再実行します
new row violates row-level securityRLS ポリシーによって操作がブロックされていますauth.uid() が想定値と一致していることを確認し、ポリシーの using 句を確認します
moddatetime トリガーが失敗します拡張機能が有効になっていませんマイグレーションの先頭に create extension if not exists "moddatetime" を追加します

例

E コマースのスキーマ(異なるドメインですが、パターンは同じです)。ストア、商品、注文、外部キーとインデックスを含む order_items の完全な E コマースマイグレーション SQL は、references/worked-schema-examples.md にあります。対応する型付きクライアントクエリは、references/typescript-client.md にあります。

リソース

次のステップ

このスキーマに認証の統合、ファイルストレージ、リアルタイムサブスクリプションを追加する場合は、supabase-auth-storage-realtime-core に進んでください。

コメント