Prisma ORM とは?
Prisma ORMは、オープンソースの次世代ORMです。以下の部分で構成されています。
-
Prisma Client: Node.jsとTypeScript用の自動生成された型安全なクエリビルダー
-
Prisma Migrate: マイグレーションシステム
-
Prisma Studio: データベース内のデータを表示・編集するためのGUI
情報Prisma Studio は、Prisma ORM の唯一の非オープンソース部分です。Prisma Studio はローカルでのみ実行できます。
Prisma Client は、Node.js (サポートされているバージョン) または TypeScript のあらゆるバックエンドアプリケーション (サーバーレスアプリケーションやマイクロサービスを含む) で使用できます。これには、REST API、GraphQL API、gRPC API、その他データベースを必要とするものすべてが含まれます。
Prisma ORMの仕組み
Prismaスキーマ
Prisma ORM ツールキットのツールを使用するすべてのプロジェクトは、Prisma スキーマから始まります。Prisma スキーマを使用すると、開発者は直感的なデータモデリング言語でアプリケーションモデルを定義できます。また、データベースへの接続が含まれており、ジェネレーターを定義します。
- リレーショナルデータベース
- MongoDB
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
datasource db {
provider = "mongodb"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model Post {
id String @id @default(auto()) @map("_id") @db.ObjectId
title String
content String?
published Boolean @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId String @db.ObjectId
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
email String @unique
name String?
posts Post[]
}
注意:Prismaスキーマには強力なデータモデリング機能があります。たとえば、「Prismaレベル」のリレーションフィールドを定義でき、これによりPrisma Client APIでのリレーションの操作が容易になります。上記の例では、
User
のposts
フィールドは「Prismaレベル」でのみ定義されており、これは基盤となるデータベースに外部キーとして現れないことを意味します。
このスキーマでは、3つのことを設定します。
- データソース: データベース接続を指定します(環境変数経由)
- ジェネレーター: Prisma Clientを生成することを示します
- データモデル: アプリケーションモデルを定義します
Prismaスキーマデータモデル
このページでは、データモデルに焦点を当てます。データソースとジェネレーターについては、それぞれのドキュメントページで詳しく学ぶことができます。
Prismaスキーマデータモデルの機能
データモデルはモデルの集合体です。モデルには2つの主要な機能があります。
- リレーショナルデータベースのテーブルまたはMongoDBのコレクションを表す
- Prisma Client APIにおけるクエリの基盤を提供する
データモデルの取得
Prismaスキーマにデータモデルを「取得」するための主要なワークフローは2つあります。
- データモデルを手動で記述し、Prisma Migrateを使用してデータベースにマッピングする
- データベースをイントロスペクトしてデータモデルを生成する
データモデルが定義されると、定義されたモデルに対してCRUDなど、より多くのクエリを公開するPrisma Clientを生成できます。TypeScriptを使用している場合、すべてのクエリ(モデルフィールドのサブセットのみを取得する場合でも)に対して完全な型安全性が得られます。
Prisma Clientでデータベースにアクセスする
Prisma Clientの生成
Prisma Clientを使用する際の最初のステップは、@prisma/client
および prisma
npm パッケージをインストールすることです。
npm install prisma --save-dev
npm install @prisma/client
次に、prisma generate
を実行できます。
npx prisma generate
prisma generate
コマンドは、Prisma スキーマを読み取り、Prisma Client コードを生成します。コードはデフォルトでnode_modules/.prisma/client
フォルダーに生成されます。
データモデルを変更した後、node_modules/.prisma/client
内のコードが更新されるように、手動で prisma generate
を実行して Prisma Client を再生成する必要があります。
Prisma Client を使用してデータベースにクエリを送信する
Prisma Clientが生成されたら、コードにインポートしてデータベースにクエリを送信できます。これがセットアップコードです。
Prisma Clientのインポートとインスタンス化
- import
- require
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
const { PrismaClient } = require('@prisma/client')
const prisma = new PrismaClient()
これで、生成されたPrisma Client API経由でクエリを送信できます。ここにいくつかのサンプルクエリがあります。Prisma Clientのすべてのクエリは通常のJavaScriptオブジェクトを返すことに注意してください。
Prisma Client APIリファレンスで利用可能な操作について詳しく学ぶことができます。
データベースからすべてのUser
レコードを取得する
// Run inside `async` function
const allUsers = await prisma.user.findMany()
返された各User
オブジェクトにposts
リレーションを含める
// Run inside `async` function
const allUsers = await prisma.user.findMany({
include: { posts: true },
})
「prisma」を含むすべてのPost
レコードをフィルタリングする
// Run inside `async` function
const filteredPosts = await prisma.post.findMany({
where: {
OR: [
{ title: { contains: 'prisma' } },
{ content: { contains: 'prisma' } },
],
},
})
同じクエリで新しいUser
と新しいPost
レコードを作成する
// Run inside `async` function
const user = await prisma.user.create({
data: {
name: 'Alice',
email: 'alice@prisma.io',
posts: {
create: { title: 'Join us for Prisma Day 2020' },
},
},
})
既存のPost
レコードを更新する
// Run inside `async` function
const post = await prisma.post.update({
where: { id: 42 },
data: { published: true },
})
TypeScriptでの使用
TypeScriptを使用する場合、このクエリの結果は静的に型付けされるため、存在しないプロパティに誤ってアクセスすることがなく(タイプミスもコンパイル時に捕捉されます)、安心してください。Prisma Clientの生成された型の活用方法については、ドキュメントの生成された型の高度な使用ページを参照してください。
Prisma ORMの典型的なワークフロー
前述のとおり、データモデルをPrismaスキーマに「取得」する方法は2つあります。どちらのアプローチを選択するかによって、主要なPrisma ORMワークフローは異なる場合があります。
Prisma Migrate
Prisma ORM に統合されたデータベースマイグレーションツールである Prisma Migrate を使用すると、ワークフローは次のようになります。
- Prismaスキーマデータモデルを手動で調整する
prisma migrate dev
CLIコマンドを使用して開発データベースをマイグレートする- アプリケーションコードでPrisma Clientを使用してデータベースにアクセスする
Prisma Migrate ワークフローの詳細については、以下を参照してください。
SQLマイグレーションとイントロスペクション
何らかの理由でPrisma Migrateを使用できない、または使用したくない場合でも、イントロスペクションを使用してデータベーススキーマからPrismaスキーマを更新できます。SQLマイグレーションとイントロスペクションを使用する際の典型的なワークフローは若干異なります。
- SQLまたはサードパーティのマイグレーションツールを使用してデータベーススキーマを手動で調整する
- データベースを(再)イントロスペクトする
- 必要に応じてPrisma Client APIを(再)設定する
- Prisma Clientを(再)生成する
- アプリケーションコードでPrisma Clientを使用してデータベースにアクセスする
イントロスペクションのワークフローの詳細については、イントロスペクションのセクションを参照してください。