prisma/prisma

GitHub: prisma/prisma

Prisma 是一个为 Node.js 和 TypeScript 提供类型安全数据库访问的新一代 ORM 框架,通过声明式 schema 建模和自动生成的查询客户端简化数据库开发工作流。

Stars: 47366 | Forks: 2476

![Prisma](https://i.imgur.com/h6UIYTu.png)

Prisma

Discord

Quickstart   •   Website   •   Docs   •   Examples   •   Blog   •   Discord   •   Twitter   •   Youtube

## 什么是 Prisma? Prisma ORM 是一个**新一代 ORM**,由以下工具组成: - [**Prisma Client**](https://www.prisma.io/docs/orm/prisma-client):为 Node.js 和 TypeScript 自动生成的、类型安全的查询构建器 - [**Prisma Migrate**](https://www.prisma.io/docs/orm/prisma-migrate):声明式数据建模和迁移系统 - [**Prisma Studio**](https://github.com/prisma/studio):用于查看和编辑数据库中数据的 GUI Prisma Client 可以用于_任何_ Node.js 或 TypeScript 后端应用程序(包括 serverless 应用程序和微服务)。这可以是一个 [REST API](https://www.prisma.io/docs/concepts/overview/prisma-in-your-stack/rest)、[GraphQL API](https://www.prisma.io/docs/concepts/overview/prisma-in-your-stack/graphql)、gRPC API 或其他任何需要数据库的应用。 **如果您需要与 Prisma ORM 一起使用的数据库,请查看 [Prisma Postgres](https://www.prisma.io/docs/getting-started/prisma-orm/quickstart/prisma-postgres?utm_source=github&utm_medium=prisma-readme);或者如果您正在寻找我们的 MCP Server,请前往[这里](https://github.com/prisma/mcp)。** ## 快速开始 ### 快速入门 (5分钟) 开始使用 Prisma 最快的方式是遵循快速入门指南。您可以选择以下两种数据库之一: - [Prisma Postgres](https://www.prisma.io/docs/getting-started/prisma-orm/quickstart/prisma-postgres) - [SQLite](https://www.prisma.io/docs/getting-started/prisma-orm/quickstart/sqlite) ### 使用您自己的数据库 如果您已经有了自己的数据库,可以按照以下指南操作: - [将 Prisma 添加到现有项目](https://www.prisma.io/docs/getting-started/prisma-orm/add-to-existing-project/postgresql) - [使用 Prisma 从零开始搭建新项目](https://www.prisma.io/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql) ## Prisma ORM 的工作原理 本节提供了关于 Prisma ORM 工作原理及其最重要技术组件的概述。如需更详细的介绍,请访问 [Prisma 文档](https://www.prisma.io/docs/)。 ### Prisma schema 每个使用 Prisma 工具集中工具的项目都以一个 [Prisma schema 文件](https://www.prisma.io/docs/orm/prisma-schema)开始。Prisma schema 允许开发者使用直观的数据建模语言定义其_应用模型_并配置_生成器_。 ``` // Data source datasource db { provider = "postgresql" } // Generator generator client { provider = "prisma-client" output = "../generated" } // Data model 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[] } ``` 在这个 schema 中,您需要配置三项内容: - **Data source**:指定您的数据库类型,从而定义您可以在 schema 中使用的功能和数据类型 - **Generator**:指示您想要生成 Prisma Client - **Data model**:定义您的应用模型 ### `prisma.config.ts` 数据库连接详细信息通过 [`prisma.config.ts`](https://www.prisma.io/docs/orm/prisma-schema/prisma-config-reference) 定义。 ``` 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`](https://www.npmjs.com/package/dotenv) 或 [`@dotenvx/dotenvx`](https://www.npmjs.com/package/@dotenvx/dotenvx) 等包。 在这种情况下,配置文件可能如下所示: ``` import 'dotenv/config' import { defineConfig, env } from 'prisma/config' export default defineConfig({ datasource: { url: env('DATABASE_URL'), }, }) ``` 要在不使用 Docker 且无需任何配置的情况下启动本地 PostgreSQL 开发服务器,请运行 `prisma dev`: ``` npx prisma dev ``` 或者,在云端快速启动一个即时 Prisma Postgres® 数据库: ``` npx create-db --interactive ``` ### Prisma 数据模型 本页的重点是数据模型。您可以在各自的文档页面上了解更多关于 [Data source](https://www.prisma.io/docs/orm/prisma-schema/overview/data-sources) 和 [Generators](https://www.prisma.io/docs/orm/prisma-schema/overview/generators) 的信息。 #### Prisma 模型的功能 数据模型是 [模型](https://www.prisma.io/docs/orm/prisma-schema/data-model/models) 的集合。模型有两个主要功能: - 表示底层数据库中的一个表 - 为 Prisma Client API 中的查询提供基础 #### 获取数据模型 将数据模型“获取”到您的 Prisma schema 中有两种主要工作流程: - 通过[内省](https://www.prisma.io/docs/orm/prisma-schema/introspection)数据库生成数据模型 - 手动编写数据模型,并使用 [Prisma Migrate](https://www.prisma.io/docs/orm/prisma-migrate) 将其映射到数据库 一旦定义了数据模型,您就可以[生成 Prisma Client](https://www.prisma.io/docs/orm/prisma-client/setup-and-configuration/generating-prisma-client),它将为定义的模型公开 CRUD 及更多查询。如果您使用的是 TypeScript,您将获得所有查询的完全类型安全(即使仅检索模型字段的子集时也是如此)。 ### 使用 Prisma Client 访问您的数据库 #### 第 1 步:安装 Prisma 首先,将 Prisma CLI 作为开发依赖项安装,并安装 Prisma Client: ``` npm install prisma --save-dev npm install @prisma/client ``` #### 第 2 步:设置您的 Prisma schema 确保您的 Prisma schema 包含一个指定了 `output` 路径的 `generator` 块: ``` generator client { provider = "prisma-client" output = "../generated" } datasource db { provider = "postgresql" // mysql, sqlite, sqlserver, mongodb or cockroachdb } ``` #### 第 3 步:配置 Prisma Config 使用 `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('DATABASE_URL'), }, }) ``` **注意**:使用 `prisma.config.ts` 时,不会自动加载 `.env` 文件中的环境变量。您可以通过在配置文件的顶部导入 `dotenv/config` 来使用 `dotenv`。对于 Bun,会自动加载 `.env` 文件。 了解更多关于 [Prisma Config](https://www.prisma.io/docs/orm/reference/prisma-config-reference) 的信息和所有可用的配置选项。 #### 第 4 步:生成 Prisma Client 使用以下命令生成 Prisma Client: ``` npx prisma generate ``` 此命令会读取您的 Prisma schema,并将 Prisma Client 代码_生成_到您的生成器配置中 `output` 路径指定的位置。 在您更改数据模型后,需要手动重新生成 Prisma Client,以确保生成的代码得到更新: ``` npx prisma generate ``` 有关[“生成 Prisma Client”](https://www.prisma.io/docs/orm/prisma-client/setup-and-configuration/generating-prisma-client)的更多信息,请参阅文档。 #### 第 5 步:使用 Prisma Client 向您的数据库发送查询 一旦生成了 Prisma Client,您就可以在代码中导入它并向您的数据库发送查询。 ##### 导入并实例化 Prisma Client 您可以从生成器配置中指定的输出路径导入并实例化 Prisma Client。在实例化 Client 时,您需要向其构造函数提供一个 [driver adapter](https://www.prisma.io/docs/orm/core-concepts/supported-databases/database-drivers#how-to-use-driver-adapters)。例如,当 PostgreSQL 使用 driver adapter 时: ``` 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 Client API 发送查询了,以下是一些查询示例。请注意,所有 Prisma Client 查询都返回_普通旧式 JavaScript 对象_。 在 [Prisma Client 文档](https://www.prisma.io/docs/orm/prisma-client)中了解更多关于可用操作的信息,或观看此[演示视频](https://www.youtube.com/watch?v=LggrE5kJ75I&list=PLn2e1F9Rfr6k9PnR_figWOcSHgc_erDr5&index=4)(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: 'Join us for Prisma Day 2021' }, }, }, }) ``` ##### 更新现有的 `Post` 记录 ``` const post = await prisma.post.update({ where: { id: 42 }, data: { published: true }, }) ``` #### 配合 TypeScript 使用 请注意,当使用 TypeScript 时,此查询的结果将被_静态类型化_,因此您不会意外访问不存在的属性(并且任何拼写错误都会在编译时被捕获)。请在文档中的[生成类型的高级用法](https://www.prisma.io/docs/orm/prisma-client/type-safety/operating-against-partial-structures-of-model-types)页面上了解更多关于利用 Prisma Client 生成类型的信息。 ## 安全 如果您有安全问题需要报告,请通过 [security@prisma.io](mailto:security@prisma.io?subject=[GitHub]%20Prisma%202%20Security%20Report%20) 联系我们。 ## 支持 ### 提出关于 Prisma 的问题 您可以在 GitHub 上的 `prisma` 代码库中提出问题并发起关于 Prisma 相关主题的[讨论](https://github.com/prisma/prisma/discussions/)。 👉 [**提出问题**](https://github.com/prisma/prisma/discussions/new) ### 创建 Prisma 的 bug 报告 如果您看到错误消息或遇到问题,请务必创建一份 bug 报告!您可以在文档中找到[创建 bug 报告的最佳实践](https://www.prisma.io/docs/guides/other/troubleshooting-orm/creating-bug-reports)(例如提供额外的调试输出)。 👉 [**创建 bug 报告**](https://pris.ly/prisma-prisma-bug-report) ### 提交功能请求 如果 Prisma 目前没有某个功能,请务必查看 [roadmap](https://www.prisma.io/docs/more/roadmap),看看该功能是否已经计划在将来推出。 如果 roadmap 上的功能关联到了 GitHub issue,请务必在该 issue 上留下一个 👍 反应,最好还能留下您对该功能的想法和评论! 👉 [**提交功能请求**](https://github.com/prisma/prisma/issues/new?assignees=&labels=&template=feature_request.md&title=) ## 贡献 请参阅我们的[贡献指南](https://github.com/prisma/prisma/blob/main/CONTRIBUTING.md)和[贡献者行为准则](https://github.com/prisma/prisma/blob/main/CODE_OF_CONDUCT.md)。 ## 测试状态 - Prisma 测试状态: [![Prisma Tests Status](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/prisma/prisma/actions/workflows/test.yml?query=branch%3Amain) 目前 ORM 代码库中已禁用定时的 CI;测试工作流会在 push、pull request 和手动执行 `workflow_dispatch` 时运行。有关最近的运行情况,请查看 [Actions 选项卡](https://github.com/prisma/prisma/actions)。
标签:GNU通用公共许可证, MITM代理, Node.js, ORM, SOC Prime, TypeScript, 后端开发, 安全插件, 开发工具, 数据库, 测试用例