はじめに
データベース操作、正直なところ面倒じゃないですか。
SQLを直接書くのは柔軟だけど型安全性がない。従来のORMは設定が複雑で学習コストが高い。そんなジレンマを抱えている人は多いと思います。
個人的には、TypeScriptでバックエンド開発をするようになってから、この問題がより顕著に感じられるようになりました。せっかく型の恩恵を受けているのに、データベース周りだけany地獄になるのは本末転倒なんですよね。
そこで今回紹介したいのがPrisma。GitHubスター数44,000超え、月間2,000万ダウンロードを誇る次世代ORMです。TypeScriptとの親和性が抜群で、一度使うと従来のORMには戻れなくなります。
Prismaとは
Prismaは、Node.jsとTypeScript向けに設計された次世代ORM(Object-Relational Mapping)ツールです。
従来のORMとは異なり、スキーマファーストなアプローチを採用しています。独自のスキーマ言語でデータモデルを定義すると、そこから型安全なクライアントコードが自動生成される仕組みです。
対応データベースも幅広く、PostgreSQL、MySQL、MariaDB、SQL Server、SQLite、MongoDB、CockroachDBをサポートしています。
特徴・メリット
1. 完全な型安全性
これ、意外と他のORMでは実現できていない部分なんですよ。Prismaでは、スキーマから自動生成されたクライアントが完璧な型情報を持っています。
// 型が自動補完される
const user = await prisma.user.findUnique({
where: { id: 1 }
})
// user.name, user.email など、定義したフィールドに型が付く
IDEの補完が効くので、フィールド名のタイポも防げます。30代になってくると、こういう細かいミスを減らせる仕組みがありがたいんですよね。
2. 直感的なスキーマ定義
Prismaのスキーマ言語は非常に読みやすいです。
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
}
リレーションの定義も明確で、SQLの知識があれば直感的に理解できます。
3. 強力なマイグレーション機能
Prisma Migrateを使えば、スキーマの変更履歴をバージョン管理できます。チーム開発では特に重宝する機能です。
4. Prisma Studio
GUIでデータベースの中身を確認・編集できるツールが付属しています。開発中のデータ確認がかなり楽になりますね。
インストール方法
# Prisma CLIをdev依存としてインストール
npm install prisma --save-dev
# Prisma Clientをインストール
npm install @prisma/client
# Prismaの初期化
npx prisma init
初期化するとprisma/schema.prismaファイルと.envファイルが生成されます。
基本的な使い方
スキーマ定義
prisma/schema.prismaにデータモデルを定義します。
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
}
マイグレーション実行
# マイグレーションファイルを作成してDBに適用
npx prisma migrate dev --name init
# Prisma Clientを生成
npx prisma generate
CRUD操作
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
// Create - ユーザー作成
const newUser = await prisma.user.create({
data: {
email: 'test@example.com',
name: 'テストユーザー',
},
})
// Read - 全ユーザー取得
const allUsers = await prisma.user.findMany()
// Read - リレーション含めて取得
const usersWithPosts = await prisma.user.findMany({
include: { posts: true },
})
// Update - ユーザー更新
const updatedUser = await prisma.user.update({
where: { id: 1 },
data: { name: '更新後の名前' },
})
// Delete - ユーザー削除
const deletedUser = await prisma.user.delete({
where: { id: 1 },
})
ネストした作成
// ユーザーと投稿を同時に作成
const userWithPost = await prisma.user.create({
data: {
email: 'alice@example.com',
name: 'Alice',
posts: {
create: {
title: '最初の投稿',
content: 'Prismaを使い始めました',
},
},
},
include: { posts: true },
})
実践的なユースケース
Next.jsとの組み合わせ
Prismaは Next.js との相性が抜群です。API Routesでの利用例を見てみましょう。
// app/api/users/route.ts
import { PrismaClient } from '@prisma/client'
import { NextResponse } from 'next/server'
const prisma = new PrismaClient()
export async function GET() {
const users = await prisma.user.findMany()
return NextResponse.json(users)
}
export async function POST(request: Request) {
const body = await request.json()
const user = await prisma.user.create({
data: body,
})
return NextResponse.json(user)
}
複雑なクエリ
// 検索・ソート・ページネーション
const posts = await prisma.post.findMany({
where: {
published: true,
title: {
contains: 'TypeScript',
},
},
orderBy: {
createdAt: 'desc',
},
skip: 0,
take: 10,
include: {
author: {
select: {
name: true,
email: true,
},
},
},
})
トランザクション
// 複数の操作をトランザクションで実行
const result = await prisma.$transaction(async (tx) => {
const user = await tx.user.create({
data: { email: 'new@example.com', name: 'New User' },
})
const post = await tx.post.create({
data: {
title: 'Welcome Post',
authorId: user.id,
},
})
return { user, post }
})
まとめ
Prismaは、TypeScriptでバックエンド開発をする人にとって、もはや必須と言っていいツールだと思います。
個人的に特に気に入っているポイントは以下の3つです。
- 型安全性: コンパイル時にエラーを検出できる安心感
- 開発体験: 補完が効くのでコーディングが快適
- マイグレーション: スキーマ変更が怖くなくなる
学習コストも比較的低く、公式ドキュメントも充実しています。月間50万人以上の開発者が使っているという実績も心強いですね。
データベース操作でストレスを感じている方は、一度試してみる価値があると思います。一度使うと、もう従来のやり方には戻れなくなりますよ。