跳至主要内容

什么是 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 APIGraphQL API、gRPC API 或任何其他需要数据库的应用程序。

Prisma ORM 如何工作?

Prisma 模式

每个使用 Prisma ORM 工具包中工具的项目都从一个 Prisma 模式 开始。Prisma 模式允许开发人员使用直观的数据建模语言定义其应用程序模型。它还包含数据库连接并定义了一个生成器

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[]
}

注意:Prisma 模式具有强大的数据建模功能。例如,它允许您定义“Prisma 级”的 关系字段,这将使使用 Prisma Client API 中的关系 更容易。在上面的例子中,User 上的 posts 字段仅在“Prisma 级”定义,这意味着它不会在底层数据库中体现为外键。

在此模式中,您配置三件事

  • 数据源:指定您的数据库连接(通过环境变量)
  • 生成器:指示您要生成 Prisma Client
  • 数据模型:定义您的应用程序模型

Prisma 模式数据模型

在本页中,重点关注数据模型。您可以在相应的文档页面上了解有关 数据源生成器 的更多信息。

Prisma 模式数据模型的功能

数据模型是 模型 的集合。模型有两个主要功能

  • 在关系型数据库中表示表或在 MongoDB 中表示集合
  • 为 Prisma Client API 中的查询提供基础

获取数据模型

有两种主要工作流可用于将数据模型“获取”到您的 Prisma 模式中

  • 手动编写数据模型并使用 Prisma Migrate 将其映射到数据库
  • 通过 内省 数据库来生成数据模型

定义数据模型后,您可以 生成 Prisma Client,它将公开为定义的模型提供的 CRUD 和更多查询。如果您使用的是 TypeScript,您将获得所有查询的完全类型安全(即使仅检索模型字段的子集)。

使用 Prisma Client 访问您的数据库

生成 Prisma Client

使用 Prisma Client 的第一步是安装 @prisma/client npm 包

npm install @prisma/client

安装 @prisma/client 包会调用 prisma generate 命令,该命令读取您的 Prisma 模式并生成 Prisma Client 代码。代码默认 生成到 node_modules/.prisma/client 文件夹中

更改数据模型后,您需要手动重新生成 Prisma Client 以确保 node_modules/.prisma/client 内部的代码得到更新

prisma generate

使用 Prisma Client 将查询发送到您的数据库

生成 Prisma Client 后,您可以在代码中导入它并将查询发送到您的数据库。这是设置代码的样子。

导入并实例化 Prisma Client
import { PrismaClient } from '@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: '[email protected]',
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 模式中。根据您选择的方法,您的主要 Prisma ORM 工作流可能会有所不同。

Prisma Migrate

使用Prisma Migrate(Prisma ORM 集成的数据库迁移工具),工作流如下所示

  1. 手动调整您的 Prisma 模式数据模型
  2. 使用prisma migrate dev CLI 命令迁移您的开发数据库
  3. 在您的应用程序代码中使用 Prisma Client 访问您的数据库

Typical workflow with Prisma Migrate

要了解有关 Prisma Migrate 工作流程的更多信息,请参阅

SQL 迁移和内省

如果由于某些原因,您无法或不想使用 Prisma Migrate,您仍然可以使用内省从您的数据库模式更新您的 Prisma 模式。使用**SQL 迁移和内省**时的典型工作流程略有不同

  1. 使用 SQL 或第三方迁移工具手动调整您的数据库模式
  2. (重新)内省您的数据库
  3. 可选地(重新)配置您的 Prisma Client API
  4. (重新)生成 Prisma Client
  5. 在您的应用程序代码中使用 Prisma Client 访问您的数据库

Introspect workflow

要了解有关内省工作流程的更多信息,请参阅内省部分