PrismaでDBを操作する
このページで学ぶこと
- Prisma とは何かがわかる
- Prisma スキーマを定義してDBにテーブルを作れる
- Prisma Client でデータを取得・作成できる
Prisma とは
Prisma は JavaScript/TypeScript 向けの ORM(Object-Relational Mapper) です。
SQLを直接書く代わりに、JavaScriptのコードでDBを操作できます。
// ❌ 素のSQLだとこう書く
const result = await db.query('SELECT * FROM todos WHERE user_id = $1', [userId])
// ✅ Prismaだとこう書ける
const todos = await prisma.todo.findMany({
where: { userId: userId }
})セットアップ
ステップ1: Prisma をインストール
npm install prisma --save-dev
npm install @prisma/client
npx prisma initprisma/schema.prisma と .env が作成されます。
ステップ2: schema.prisma を編集する
前のページで設計した構造をPrismaスキーマとして書きます。
prisma/schema.prisma を開いて編集する。
// prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL") // .env の DATABASE_URL を読む
}
model User {
id Int @id @default(autoincrement())
name String
email String @unique
todos Todo[]
createdAt DateTime @default(now()) @map("created_at")
@@map("users") // テーブル名を "users" にする
}
model Todo {
id Int @id @default(autoincrement())
title String
completed Boolean @default(false)
userId String @map("user_id") // Supabase Auth のユーザーIDは UUID(文字列型)
createdAt DateTime @default(now()) @map("created_at")
@@map("todos")
}ステップ3: DBにテーブルを作成する(マイグレーション)
npx prisma migrate dev --name init✅ Your database is now in sync with your schema. と表示されれば成功です。
Supabase のダッシュボード(Table Editor)を開くと users と todos テーブルができているはずです。
マイグレーションとは?
スキーマの変更をDBに反映させることです。
migrate devは開発環境用で、スキーマを変更するたびに実行します。
ステップ4: Prisma Client を初期化する
lib/prisma.js を作成する。
// lib/prisma.js
import { PrismaClient } from '@prisma/client'
// 開発環境での重複インスタンス防止
const globalForPrisma = globalThis
export const prisma = globalForPrisma.prisma ?? new PrismaClient()
if (process.env.NODE_ENV !== 'production') {
globalForPrisma.prisma = prisma
}Prisma Client の基本操作
データを取得する
import { prisma } from '../lib/prisma'
// 全件取得
const todos = await prisma.todo.findMany()
// 条件付き取得
const myTodos = await prisma.todo.findMany({
where: { userId: 1 }
})
// 1件取得
const todo = await prisma.todo.findUnique({
where: { id: 1 }
})
// 関連データも一緒に取得(JOIN)
const user = await prisma.user.findUnique({
where: { id: 1 },
include: { todos: true } // userとそのtodosを取得
})データを作成する
const newTodo = await prisma.todo.create({
data: {
title: '牛乳を買う',
userId: 1,
}
})データを更新する
const updated = await prisma.todo.update({
where: { id: 1 },
data: { completed: true }
})データを削除する
await prisma.todo.delete({
where: { id: 1 }
})API Route と組み合わせる
app/api/todos/route.js をPrismaを使うように書き換えましょう。
// app/api/todos/route.js
import { NextResponse } from 'next/server'
import { prisma } from '../../../lib/prisma'
export async function GET() {
const todos = await prisma.todo.findMany({
orderBy: { createdAt: 'desc' } // 新しい順に並べる
})
return NextResponse.json(todos)
}
export async function POST(request) {
const body = await request.json()
if (!body.title) {
return NextResponse.json({ error: 'titleは必須です' }, { status: 400 })
}
const todo = await prisma.todo.create({
data: {
title: body.title,
userId: 'temp', // TODO: 認証後は実際のユーザーID(文字列のUUID)を使う
}
})
return NextResponse.json(todo, { status: 201 })
}確認しよう
-
npx prisma initでPrismaを初期化した -
schema.prismaにモデルを定義した -
npx prisma migrate devでテーブルを作成した - Supabaseダッシュボードでテーブルができていることを確認した
-
prisma.todo.findMany()でデータを取得できた
AIに聞いてみよう
「Prismaのスキーマを変更したとき、既存のデータを保ちながらマイグレーションするにはどうしますか?」
次のステップ
Last updated on