什麼是 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 Schema
每個使用 Prisma ORM 工具包中工具的專案都從 Prisma Schema 開始。Prisma Schema 允許開發者以直觀的資料建模語言定義其應用程式模型。它還包含與資料庫的連線並定義一個生成器
- 關係型資料庫
- 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 Schema 具有強大的資料建模功能。例如,它允許你定義“Prisma 級別”的 關係欄位,這將使在 Prisma Client API 中處理關係變得更容易。在上面的例子中,
User上的posts欄位僅在“Prisma 級別”定義,這意味著它不會在底層資料庫中表現為外部索引鍵。
在此 schema 中,你配置三件事:
- 資料來源:指定你的資料庫連線(透過環境變數)
- 生成器:指示你想要生成 Prisma Client
- 資料模型:定義你的應用程式模型
Prisma Schema 資料模型
在本頁面中,重點是資料模型。你可以在相應的文件頁面上了解更多關於 資料來源 和 生成器 的資訊。
Prisma Schema 資料模型的功能
資料模型是 模型 的集合。模型有兩個主要功能:
- 代表關係型資料庫中的表或 MongoDB 中的集合
- 為 Prisma Client API 中的查詢提供基礎
獲取資料模型
有兩種主要的“獲取”資料模型到你的 Prisma Schema 的工作流:
- 手動編寫資料模型並透過 Prisma Migrate 將其對映到資料庫
- 透過 內省 資料庫生成資料模型
一旦定義了資料模型,你就可以 生成 Prisma Client,它將為定義好的模型提供 CRUD 和更多查詢。如果你正在使用 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 Schema 並生成 Prisma Client 程式碼。預設情況下,程式碼會生成到 node_modules/.prisma/client 資料夾中。
更改資料模型後,你需要透過執行 prisma generate 手動重新生成 Prisma Client,以確保 node_modules/.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 Schema 中的方法。根據你選擇的方法,你的主要 Prisma ORM 工作流可能會有所不同。
Prisma Migrate
使用 Prisma Migrate,Prisma ORM 的整合資料庫遷移工具,工作流如下所示:
- 手動調整你的 Prisma Schema 資料模型
- 使用
prisma migrate devCLI 命令遷移你的開發資料庫 - 在你的應用程式程式碼中使用 Prisma Client 訪問資料庫

要了解更多關於 Prisma Migrate 工作流的資訊,請參閱:
SQL 遷移和內省
如果由於某種原因,你無法或不想使用 Prisma Migrate,你仍然可以使用內省從資料庫 schema 更新你的 Prisma schema。使用 SQL 遷移和內省的典型工作流略有不同:
- 使用 SQL 或第三方遷移工具手動調整你的資料庫 schema
- (重新)內省你的資料庫
- 可選地(重新)配置你的 Prisma Client API
- (重新)生成 Prisma Client
- 在你的應用程式程式碼中使用 Prisma Client 訪問資料庫

要了解更多關於內省工作流的資訊,請參閱內省部分。