スターターアプリ
データベースと 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.md と DEPLOYMENT.md を読んでください。