Prisma ORM

Prisma ORMは、次世代のTypeScript/JavaScript向けORMです。型安全性、自動生成されるクライアント、直感的なデータモデリング言語を特徴とし、PostgreSQL、MySQL、SQLite、MongoDB、SQL Serverをサポートします。開発者体験を最優先に設計されたモダンなORMです。

ORMTypeScriptJavaScriptデータベース型安全性Prisma

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

スター履歴

prisma/prisma Star History
データ取得日時: 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