什么是 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 将其映射到数据库
- 通过 内省 (introspection) 数据库来生成数据模型
一旦定义了数据模型,您就可以 生成 Prisma Client,这将为定义的模型公开 CRUD 和更多查询。如果您正在使用 TypeScript,您将获得所有查询的完全类型安全(即使仅检索模型字段的子集)。
使用 Prisma Client 访问您的数据库
生成 Prisma Client
使用 Prisma Client 的第一步是安装 @prisma/client
和 prisma
npm 包
npm install @prisma/client
npm install prisma --save-dev
然后,您可以运行 prisma generate
npx prisma generate
prisma generate
命令读取您的 Prisma Schema 并生成 Prisma Client 代码。代码默认生成到 node_modules/.prisma/client
文件夹中。
在您更改数据模型后,您需要手动重新生成 Prisma Client,方法是运行 prisma generate
,以确保 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 dev
CLI 命令迁移您的开发数据库 - 在您的应用程序代码中使用 Prisma Client 访问您的数据库
要了解更多关于 Prisma Migrate 工作流程的信息,请参阅
SQL 迁移和内省 (introspection)
如果由于某些原因,您不能或不想使用 Prisma Migrate,您仍然可以使用内省 (introspection) 从您的数据库 schema 更新您的 Prisma Schema。当使用 SQL 迁移和内省 (introspection) 时,典型的工作流程略有不同
- 使用 SQL 或第三方迁移工具手动调整您的数据库 schema
- (重新)内省 (Introspect) 您的数据库
- (可选)(重新)配置您的 Prisma Client API)
- (重新)生成 Prisma Client
- 在您的应用程序代码中使用 Prisma Client 访问您的数据库
要了解更多关于内省 (introspection) 工作流程的信息,请参阅 内省 (introspection) 章节。