Prisma 入門:schema 定義からマイグレーションと CRUD まで
Prisma は Node.js / TypeScript 向けの ORM です。schema.prisma にモデルを定義すると型安全な Prisma Client が自動生成され、SQL を書かずに型付きでデータベースを操作できます。
対応データベース:PostgreSQL・MySQL・SQLite・SQL Server・MongoDB(プレビュー)
インストール
npm install prisma --save-dev npm install @prisma/client
インストール後、プロジェクトを初期化します。
npx prisma init
実行すると以下が生成されます。
prisma/ └── schema.prisma # モデル定義ファイル .env # DATABASE_URL を設定するファイル
.env の設定
.env に接続先のデータベース URL を設定します。
# SQLite(ファイルベース・ローカル開発に手軽) DATABASE_URL="file:./dev.db" # PostgreSQL DATABASE_URL="postgresql://user:password@localhost:5432/mydb" # MySQL DATABASE_URL="mysql://user:password@localhost:3306/mydb"
schema.prisma の書き方
prisma/schema.prisma にデータソースとモデルを定義します。
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
createdAt DateTime @default(now())
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
createdAt DateTime @default(now())
}
よく使うフィールド修飾子
| 修飾子 | 説明 |
|---|---|
@id |
主キー |
@default(autoincrement()) |
自動採番 |
@default(now()) |
現在日時をデフォルト値に |
@unique |
ユニーク制約 |
? |
NULL 許容(例:String?) |
@relation |
リレーションの定義 |
マイグレーション
スキーマを定義したら、マイグレーションを実行してテーブルを作成します。
# マイグレーションファイルを生成してDBに適用 npx prisma migrate dev --name init
マイグレーションファイルは prisma/migrations/ に保存されます。
# 本番環境への適用(マイグレーションファイルのみ適用・生成しない) npx prisma migrate deploy
スキーマを変更した後は再度 migrate dev を実行するとマイグレーションが追加されます。
Prisma Client の生成
マイグレーション時に自動生成されますが、スキーマを変更したときは手動で再生成します。
npx prisma generate
CRUD 操作
PrismaClient をインスタンス化してクエリを実行します。
import { PrismaClient } from "@prisma/client"
const prisma = new PrismaClient()
一覧取得(findMany)
const users = await prisma.user.findMany()
// 条件を指定
const publishedPosts = await prisma.post.findMany({
where: { published: true },
orderBy: { createdAt: "desc" },
take: 10,
})
// リレーションを含める
const usersWithPosts = await prisma.user.findMany({
include: { posts: true },
})
1件取得(findUnique / findFirst)
// 主キーやユニークフィールドで取得
const user = await prisma.user.findUnique({
where: { id: 1 },
})
// 条件に合う最初の1件
const user = await prisma.user.findFirst({
where: { email: { contains: "@example.com" } },
})
作成(create)
const user = await prisma.user.create({
data: {
email: "alice@example.com",
name: "Alice",
},
})
// リレーションを同時に作成
const userWithPost = await prisma.user.create({
data: {
email: "bob@example.com",
name: "Bob",
posts: {
create: { title: "はじめての投稿" },
},
},
})
更新(update / updateMany)
// 1件更新
const updated = await prisma.user.update({
where: { id: 1 },
data: { name: "Alice Smith" },
})
// 条件に合う複数件を更新
await prisma.post.updateMany({
where: { authorId: 1 },
data: { published: true },
})
削除(delete / deleteMany)
// 1件削除
await prisma.user.delete({
where: { id: 1 },
})
// 条件に合う複数件を削除
await prisma.post.deleteMany({
where: { published: false },
})
Prisma Studio(GUI でデータを確認)
npx prisma studio
ブラウザで http://localhost:5555 が開き、テーブルのデータを GUI で確認・編集できます。
よく使うコマンドまとめ
| コマンド | 説明 |
|---|---|
npx prisma init |
プロジェクトの初期化 |
npx prisma migrate dev --name 名前 |
マイグレーション生成・適用(開発用) |
npx prisma migrate deploy |
マイグレーション適用(本番用) |
npx prisma generate |
Prisma Client を再生成 |
npx prisma db push |
マイグレーションなしでスキーマをDBに反映(プロトタイプ用) |
npx prisma db seed |
シードデータの投入 |
npx prisma studio |
GUI でデータを確認・編集 |
npx prisma format |
schema.prisma をフォーマット |
TypeScript での型定義の書き方については「TypeScript ジェネリクス入門:<T> の基本と型制約の書き方」も参照してください。