Skip to Content

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 }
})
javascript

セットアップ

ステップ1: Prisma をインストール

npm install prisma --save-dev
npm install @prisma/client
npx prisma init
bash

prisma/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")
}
prisma

ステップ3: DBにテーブルを作成する(マイグレーション)

npx prisma migrate dev --name init
bash

✅ Your database is now in sync with your schema. と表示されれば成功です。
Supabase のダッシュボード(Table Editor)を開くと userstodos テーブルができているはずです。

マイグレーションとは?
スキーマの変更を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
}
javascript

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を取得
})
javascript

データを作成する

const newTodo = await prisma.todo.create({
  data: {
    title: '牛乳を買う',
    userId: 1,
  }
})
javascript

データを更新する

const updated = await prisma.todo.update({
  where: { id: 1 },
  data: { completed: true }
})
javascript

データを削除する

await prisma.todo.delete({
  where: { id: 1 }
})
javascript

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 })
}
javascript

確認しよう

  • npx prisma init でPrismaを初期化した
  • schema.prisma にモデルを定義した
  • npx prisma migrate dev でテーブルを作成した
  • Supabaseダッシュボードでテーブルができていることを確認した
  • prisma.todo.findMany() でデータを取得できた

AIに聞いてみよう

「Prismaのスキーマを変更したとき、既存のデータを保ちながらマイグレーションするにはどうしますか?」


次のステップ

CRUD操作を実装しよう

Last updated on