Prisma ORM
Prisma ORMは、次世代のTypeScript/JavaScript向けORMです。型安全性、自動生成されるクライアント、直感的なデータモデリング言語を特徴とし、PostgreSQL、MySQL、SQLite、MongoDB、SQL Serverをサポートします。開発者体験を最優先に設計されたモダンなORMです。
GitHub概要
prisma/prisma
Next-generation ORM for Node.js & TypeScript | PostgreSQL, MySQL, MariaDB, SQL Server, SQLite, MongoDB and CockroachDB
スター43,491
ウォッチ231
フォーク1,830
作成日:2019年6月20日
言語:TypeScript
ライセンス:Apache License 2.0
トピックス
cockroachdbdatabasejavascriptmariadbmongomongodbmongodb-ormmssqlmysqlnodejsormpostgrespostgresqlprismaprisma-clientquery-buildersql-serversqlitesqlservertypescript
スター履歴
データ取得日時: 2025/8/13 01:43
ライブラリ
Prisma ORM
概要
Prisma ORMは、次世代のTypeScript/JavaScript向けORMです。型安全性、自動生成されるクライアント、直感的なデータモデリング言語を特徴とし、PostgreSQL、MySQL、SQLite、MongoDB、SQL Serverをサポートします。開発者体験を最優先に設計されたモダンなORMです。
詳細
Prismaは従来のORMとは異なるアプローチを採用しています。スキーマファーストの設計により、データベーススキーマを宣言的に定義し、そこから型安全なクライアントコードを自動生成します。これにより、実行時エラーを大幅に削減し、開発者の生産性を向上させます。
主な特徴
- 型安全性: TypeScriptとの完全な統合
- 自動マイグレーション: スキーマの変更を安全に適用
- Prisma Studio: ビジュアルなデータベース管理ツール
- 豊富なリレーション: 複雑なデータ関係の簡単な表現
- パフォーマンス最適化: 効率的なクエリ生成
メリット・デメリット
メリット
- TypeScriptでの開発において圧倒的な型安全性
- 直感的なクエリ構文で学習コストが低い
- 自動生成されるマイグレーションによる安全なスキーマ管理
- Serverless環境での優秀なパフォーマンス
- 活発なコミュニティとドキュメントの充実
デメリット
- スキーマファーストのため、既存データベースの移行に手間
- 生成されるクライアントのサイズが大きくなる場合がある
- 複雑なSQL文の表現に制限がある場合がある
- まだ新しいツールのため、エンタープライズでの実績が限定的
参考ページ
書き方の例
基本的なセットアップ
npm install prisma @prisma/client
npx prisma init
スキーマ定義
// prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
name String
email String @unique
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String
authorId Int
author User @relation(fields: [authorId], references: [id])
}
クライアント生成とクエリ
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
// ユーザー作成
const user = await prisma.user.create({
data: {
name: '田中太郎',
email: '[email protected]',
posts: {
create: {
title: '最初の投稿',
content: 'Prismaを使った最初の投稿です'
}
}
}
})
// 投稿を含むユーザー取得
const userWithPosts = await prisma.user.findUnique({
where: { email: '[email protected]' },
include: { posts: true }
})
トランザクション
const result = await prisma.$transaction(async (tx) => {
const user = await tx.user.create({
data: { name: '山田花子', email: '[email protected]' }
})
const post = await tx.post.create({
data: {
title: 'トランザクションテスト',
content: 'トランザクション内での投稿',
authorId: user.id
}
})
return { user, post }
})
複雑なクエリ
// ページネーション付きの検索
const posts = await prisma.post.findMany({
where: {
title: { contains: 'Prisma' },
author: { email: { endsWith: '@example.com' } }
},
include: { author: true },
orderBy: { createdAt: 'desc' },
skip: 10,
take: 5
})
// 集計クエリ
const postCount = await prisma.post.groupBy({
by: ['authorId'],
_count: { id: true },
having: { id: { _count: { gt: 5 } } }
})
マイグレーション
# マイグレーション生成
npx prisma migrate dev --name add_user_model
# 本番環境へのマイグレーション適用
npx prisma migrate deploy
# スキーマリセット(開発時のみ)
npx prisma migrate reset