
Prisma ORM 是一个下一代 ORM,由以下工具组成:
Prisma 客户端可以在任何 Node.js 或 TypeScript 后端应用程序(包括无服务器应用和微服务)中使用。这可以是一个 REST API,一个 GraphQL API,一个 gRPC API,或任何需要数据库的应用。
如果您需要与 Prisma ORM 配合使用的数据库,请查看 Prisma Postgres 或者我们的 MCP 服务器,请访问 这里。
最快的方式是按照快速开始指南进行操作。您可以选择以下两种数据库之一:
如果您已经有自己的数据库,可以参考以下指南:
本节提供了一个高层次的概述,说明了 Prisma ORM 的工作原理及其最重要的技术组件。如需更详细的介绍,请参阅 Prisma 文档。
每个使用 Prisma 工具包中的工具的项目都始于一个 Prisma 模式文件。Prisma 模式允许开发人员用一种直观的数据建模语言定义其应用程序模型并配置生成器。
// 数据源
datasource db {
provider = "postgresql"
}
// 生成器
generator client {
provider = "prisma-client"
output = "../generated"
}
// 数据模型
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.config.ts数据库连接详情通过 prisma.config.ts 文件定义。
import { defineConfig } from 'prisma/config'
export default defineConfig({
datasource: {
url: 'postgres://...',
},
})
如果将数据库连接字符串存储在 process.env 中,可以通过 env 函数以类型安全的方式访问它,并在运行时抛出错误,如果缺少该变量:
import { defineConfig, env } from 'prisma/config'
export default defineConfig({
datasource: {
url: env('DATABASE_URL'),
},
})
Prisma ORM 不会自动加载 .env 文件。如果您想从 .env 文件填充环境变量,请考虑使用诸如 dotenv 或 @dotenvx/dotenvx 的包。
在这种情况下,配置文件可能如下所示:
import 'dotenv/config'
import { defineConfig, env } from 'prisma/config'
export default defineConfig({
datasource: {
url: env('DATABASE_URL'),
},
})
要启动本地 PostgreSQL 开发服务器而无需使用 Docker 并且无需任何配置,请运行 prisma dev:
npx prisma dev
或者,在云端即时启动一个 Prisma Postgres® 数据库:
npx create-db --interactive
在此页面上,重点在于数据模型。您可以在相应的文档页面上了解更多关于 数据源 和 生成器 的信息。
数据模型是一组 模型。一个模型有两个主要功能:
获取数据模型有两种主要的工作流程:
一旦数据模型被定义,您可以 生成 Prisma 客户端,它将暴露已定义模型的 CRUD 和更多查询。如果您使用 TypeScript,您将获得所有查询的完全类型安全性(即使仅检索模型字段的子集)。
首先,将 Prisma CLI 安装为开发依赖项,并安装 Prisma 客户端:
npm install prisma --save-dev
npm install @prisma/client
确保您的 Prisma 模式包含一个具有指定 output 路径的 generator 块:
generator client {
provider = "prisma-client"
output = "../generated"
}
datasource db {
provider = "postgresql" // mysql, sqlite, sqlserver, mongodb 或 cockroachdb
}
使用 prisma.config.ts 文件配置 Prisma CLI。此文件配置 Prisma CLI 子命令,如 migrate 和 studio。在项目根目录创建一个 prisma.config.ts 文件:
import { defineConfig, env } from 'prisma/config'
type Env = {
DATABASE_URL: string
}
export default defineConfig({
schema: 'prisma/schema.prisma',
migrations: {
path: 'prisma/migrations',
},
datasource: {
url: env<Env>('DATABASE_URL'),
},
})
注意:当使用 prisma.config.ts 时,不会自动加载 .env 文件中的环境变量。您可以通过在配置文件顶部导入 dotenv/config 来使用 dotenv。对于 Bun,.env 文件会自动加载。
了解更多信息,请参阅 Prisma 配置 及所有可用的配置选项。
使用以下命令生成 Prisma 客户端:
npx prisma generate
此命令读取您的 Prisma 模式,并根据生成器配置中的 output 路径生成 Prisma 客户端代码。
更改数据模型后,您需要手动重新生成 Prisma 客户端,以确保生成的代码得到更新:
npx prisma generate
有关“生成 Prisma 客户端”的更多信息,请参阅 文档。
一旦生成了 Prisma 客户端,您就可以在代码中导入它并向数据库发送查询。
您可以从生成器配置中指定的输出路径导入并实例化 Prisma 客户端:
import { PrismaClient } from './generated/client'
const prisma = new PrismaClient()
注意:根据您的数据库,您可能需要使用一个 驱动适配器。例如,当使用带有驱动适配器的 PostgreSQL 时:
import { PrismaClient } from './generated/client'
import { PrismaPg } from '@prisma/adapter-pg'
const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL })
const prisma = new PrismaClient({ adapter })
要加载环境变量,您可以使用 dotenv 通过导入 dotenv/config,使用 tsx --env-file=.env,node --env-file=.env,或 Bun(它会自动加载 .env)。
现在您可以开始通过生成的 Prisma 客户端 API 发送查询,这里有一些示例查询。请注意,所有 Prisma 客户端查询返回的是普通的 JavaScript 对象。
了解更多信息,请参阅 Prisma 客户端文档 或观看这个 演示视频(2 分钟)。
User 记录const allUsers = await prisma.user.findMany()
User 对象中包含 posts 关系const allUsers = await prisma.user.findMany({
include: { posts: true },
})
"prisma" 的 Post 记录const filteredPosts = await prisma.post.findMany({
where: {
OR: [{ title: { contains: 'prisma' } }, { content: { contains: 'prisma' } }],
},
})
User 和一个新的 Post 记录const user = await prisma.user.create({
data: {
name: 'Alice',
email: 'alice@prisma.io',
posts: {
create: { title: '加入我们参加 2021 年 Prisma 日活动' },
},
},
})
Post 记录const post = await prisma.post.update({
where: { id: 42 },
data: { published: true },
})
请注意,当使用 TypeScript 时,此查询的结果将是静态类型的,因此您不会意外地访问不存在的属性(并且任何拼写错误都会在编译时被捕获)。了解更多信息,请参阅文档中的 高级使用生成类型 页面。
Prisma 拥有一个庞大且支持性的 社区,充满热情的应用程序开发者。您可以在 Discord 和 GitHub 加入我们。
使用 Prisma 制作了一些很棒的东西?🌟 展示一下这些 徽标,非常适合您的 README 或网站。
[](https://prisma.io)
[](https://prisma.io)
如果您有安全问题需要报告,请联系我们 security@prisma.io。
您可以在 GitHub 上的 prisma 仓库中提问和发起 讨论 关于与 Prisma 相关的主题。
👉 提问
如果您看到错误消息或遇到问题,请务必创建一个 Bug 报告!您可以在文档中找到 创建 Bug 报告的最佳实践(如包含额外的调试输出)。
如果 Prisma 当前没有某个特定功能,请务必查看 路线图,看看是否已经计划在未来实现。
如果路线图上的功能链接到了一个 GitHub 问题,请务必在该问题上留下一个 👍 反应,并尽可能添加一条评论,表达您对该功能的看法!
👉 提交功能请求