スターターアプリ

データベースと migration

PostgreSQL、Drizzle schema、テスト DB、本番 migration runner を安全に扱います。

スターターのコミット 7d452a6 と同期済みです。

スターターは PostgreSQL と Drizzle を使います。src/db/schema.ts が schema の正本で、src/db/migrations/ のコミット済み SQL がデプロイ履歴です。db() を呼べるのは src/models/** だけです。

ローカル手順

pnpm setup は開発用とテスト用 DB を分けて作ります。テスト DB 名には test が必要で、安全機構はそれ以外の DB の truncate を拒否します。

schema 変更後:

pnpm db:generate
pnpm db:migrate
pnpm test:db:setup
pnpm test:db

生成 SQL と meta/_journal.json をコードと一緒にコミットし、デプロイ済み migration は編集しません。

本番手順

アプリのデプロイ時に migration は自動実行されません。

pnpm db:check:prod
pnpm db:migrate:prod

本番 runner は非対話で PostgreSQL advisory lock を取得し checksum を検証します。先にバックアップし、schema とアプリを別々にリリースしても新旧コードが動く expand/contract 変更にします。

データ規約

  • 数値 id は内部用、公開 API は uuid を使います。
  • 金額は最小通貨単位の整数と通貨コードで保存します。
  • tenant 行は org_uuid を持ち、全 model query で限定します。
  • idempotency key と transaction number は DB の一意制約で守ります。
  • 広範な外部キー結合を意図的に避け、削除順序と参照確認は service と lifecycle policy が担います。
  • 予約は PostgreSQL exclusion constraint でも保持・確定枠の重複を防ぎます。

本番データ契約を変える前にスターターの docs/database.mdDEPLOYMENT.md を読んでください。

データベースと migration · Sushi SaaS