Prisma 入門:schema 定義からマイグレーションと CRUD まで

スポンサーリンク

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> の基本と型制約の書き方」も参照してください。