データベース

テーブルの追加、マイグレーション、アプリからのクエリ方法。

すべてのアプリは単一のPostgresデータベースを共有しています。Prismaはスキーマを管理(マイグレーション生成も含む)し、アプリはランタイムでpgライブラリを使います。ローカルでマイグレーションを実行することはありません — PRとマージ時に自動生成・自動適用されます。

単一のスキーマファイル

すべてのアプリのすべてのテーブルは1つのファイルに入っています:

shared/database/prisma/schema.prisma

あなたのアプリのテーブルは、他のすべてのアプリのテーブルと同じファイルに並びます。所有者が一目でわかるように、アプリ固有のテーブルには必ずアプリ名のsnake_caseプレフィックスを付けてください:

// ============================================
// Meal Planner Tables
// ============================================
model MealPlanner_Recipe {
  id        String   @id @default(cuid())
  name      String
  createdAt DateTime @default(now())

  @@map("meal_planner_recipe")
}

@@map(...)が実際のSQLテーブル名で、Prismaモデル名はコード生成時の可読性のためのものです。

詳しい規則は命名規則を参照してください。

マイグレーションワークフロー(ローカル設定不要)

prisma migrate devを叩いたり、.sqlファイルを手で管理することはありません。パイプラインがやってくれます:

  1. スキーマを編集: shared/database/prisma/schema.prismaにモデルを追加/変更。
  2. ドキュメントを更新: shared/schema.mdに所有者、目的、関連を反映。
  3. フィーチャーブランチにコミット・プッシュし、mainへのPRを作成。
  4. CIがマイグレーションを自動生成してPRにコミットバック。
  5. PR専用のNeon DBブランチが作成され、マイグレーションが適用され、プレビューアプリがそのDBでデプロイされます。
  6. mainへマージすると、Neon mainにマイグレーションが適用され、本番が再デプロイされます。

追加変更を優先しましょう: 既存を修正するのではなく、新しいテーブルやNULL可能カラムを追加します。データマイグレーションが必要なスキーマ変更は開発者のレビューが必要です。

Claudeに新しいテーブルを追加してもらう
Claudeプロンプト
meal-plannerアプリ用に「reservations」テーブルを追加してください。カラムは id, user_email, party_size, start_time, created_at です。モノレポのスキーマ規則に従い、shared/schema.mdも更新してください。

ランタイムでのクエリ

pgをテンプレートのgetDb()ヘルパー(app/_lib/db.ts)経由で使います。必ずパラメータ化クエリ$1, $2, …)を使ってください:

データの読み取りtypescript
import { getDb } from '@/app/_lib/db';

const db = getDb();
const result = await db.query(
  'SELECT * FROM meal_planner_recipe WHERE user_id = $1',
  [userId]
);
const recipes = result.rows;
データの書き込みtypescript
import { getDb } from '@/app/_lib/db';

const db = getDb();
const result = await db.query(
  'INSERT INTO meal_planner_recipe (name, user_id) VALUES ($1, $2) RETURNING *',
  [name, userId]
);
const newRecipe = result.rows[0];

文字列連結でSQLを組み立てないでください — SQLインジェクションになります。$1 / $2プレースホルダを使いましょう。

実際にDBに当たる場所

データベースクエリはPRプレビュー環境本番でのみ動きます — ローカルでは動きません。PRを開くと、パイプラインがマイグレーションを適用した専用Neonブランチを作成し、プレビューデプロイがそこに接続されます。データベースの挙動はそこでテストします。プレビューURLはPRコメントに投稿されます。

うまくいかないとき

PRのマイグレーションステップが失敗(赤いチェック)したときは、トラブルシューティングのデータベースマイグレーションエラーを参照してください。

クイズ

Quiz

`shared/database/prisma/schema.prisma`に新しいモデルを追加しました。本番データベースに反映させるために次に何をしますか?