2024 年 11 月 28 日

Prisma 6:更佳性能、更高灵活性和类型安全的 SQL

今天,我们发布 Prisma v6!自上次主要版本以来,我们一直在努力整合用户反馈,使 Prisma ORM 更快、更灵活,并添加了诸如类型安全的原始 SQL 查询等惊人的功能。

Prisma v6:您需要了解的内容

我们很高兴地分享,我们已经发布了 Prisma ORM 的另一个主要版本增量。我们想借此机会回顾自 Prisma v5 以来发生的一切。

如果您正在使用 Prisma ORM 并想升级到 v6,请查看升级指南


升级到 v6

性能:JOIN 和更高效的查询

在开发 Prisma ORM 时,我们遵循了“使其工作、使其正确、使其快速”的方法。自 2021 年首次发布以来,我们不断投入以提高查询性能,并且很自豪地分享,自上次主要版本发布以来,我们已经能够显著提高查询速度。

选择最佳 JOIN 策略

原则上,当您需要查询通过外键相关的多个表中的数据时,有两种不同的方法

  • 数据库级别:使用 SQL JOIN 关键字向数据库发送单个查询,让数据直接由数据库连接
  • 应用程序级别:向数据库中的各个表发送多个查询,并在您的应用程序中自己连接数据。

根据您的用例、数据库架构和其他几个因素,一种策略可能比另一种更合适。在 Prisma ORM v5.7.0之前,Prisma ORM 总是使用应用程序级别的 JOIN 策略。

但是,通过 v5.7.0 版本,我们现在允许您为您的用例选择最佳 JOIN 策略,确保您始终可以获得最佳的查询性能。要选择连接策略,您可以在关系查询上使用 relationLoadStrategy 选项,例如

如果您想了解更多关于这两种方法在底层如何工作以及何时首选哪种 JOIN 策略的信息,请查看这篇博文:Prisma ORM 现在允许您选择最佳连接策略(预览)

嵌套创建操作的性能改进

使用 Prisma ORM,您可以在嵌套查询中创建多个新记录,例如

v5.11.0之前的版本中,Prisma ORM 会将其转换为多个 SQL INSERT 查询,每个查询都需要单独往返数据库。从这个版本开始,这些嵌套的 create 查询进行了优化,并且 INSERT 查询以批量形式在单次往返中发送到数据库。这些优化适用于一对多以及多对多关系。

自 v5 以来几乎每个版本都更快地查询

如果您查看 GitHub 上的 Prisma ORM 发布,您会发现几乎每个版本都带有一些性能改进。

我们致力于继续投资于查询性能,以确保您的查询尽可能快💚。顺便说一句,如果您有兴趣了解 Prisma ORM 在性能方面与其他 TypeScript ORM 的比较,请查看我们的TypeScript ORM 基准测试

灵活性:Node.js 驱动程序、Edge 支持、多个架构文件等等

在过去的一年中,我们不仅提高了性能,而且使 Prisma ORM 更加灵活。自 Prisma v5 以来,我们已经可以在新环境中使用 Prisma ORM(例如 Cloudflare Workers 甚至通过 Expo 的 React Native 应用程序),使用新的数据库,并实现了非常受欢迎的功能,例如将您的 schema.prisma 分割为多个文件,能够从批量创建查询中返回已创建的记录,或者从查询结果负载中排除特定字段。

支持来自 PlanetScale 和 Neon 的无服务器驱动程序

PlanetScaleNeon 都发布了无服务器驱动程序,这些驱动程序可以通过 HTTP 访问其数据库实例(而不是通常用于数据库连接的 TCP)。这些无服务器驱动程序在无服务器和边缘环境中特别有用,在这些环境中,启动 TCP 连接可能过于昂贵或完全不可能。

v5.4.0 中,我们发布了Prisma ORM 中对自定义数据库驱动程序的支持,从而可以使用 PlanetScale 和 Neon 无服务器驱动程序。这是一个使用其无服务器驱动程序连接到 PlanetScale 实例的示例

Prisma ORM:一种与数据库对话的边缘就绪方式

边缘函数(例如 Cloudflare Workers 或 Vercel 边缘函数)越来越受欢迎。由于它们具有高度的地域分布并靠近用户,因此它们能够实现闪电般的响应时间。

v5.11.0 版本起,Prisma ORM 可以在这些边缘环境中使用。这是一个重大的成就,我们很高兴看到开发者们在边缘环境中使用 Prisma ORM 构建应用!

您可以在这篇博客文章中了解有关此功能的更多信息:Prisma ORM 对边缘函数的支持现已预览

新数据库:D1 和 Turso

自 v5 版本起,我们不仅启用了 Prisma ORM 在新运行时的使用。我们还增加了对新数据库的支持,例如 Cloudflare D1Turso

这两个数据库都基于 SQLite,非常适合在边缘构建应用程序。

将 Prisma 模式拆分为多个文件

v5.15.0 版本中,我们解决了一个热门的功能请求,使其能够使用多个文件来构成您的 Prisma 模式。例如,您现在可以拥有这两个文件,每个文件都包含一个模型

user.prisma

post.prisma

当您运行迁移或其他 Prisma CLI 命令时,CLI 会将各个文件合并为一个文件。在我们的公告博客文章中了解有关此功能的更多信息:在 v5.15 中将您的 Prisma 模式组织成多个文件

使 Prisma Client API 更加灵活

除了所有这些改进之外,我们还在 Prisma Client API 中加入了新的功能,使其更加容易和方便地从数据库查询数据。

例如,新的 createManyAndReturn() 查询允许您在单个查询中创建多个记录,同时返回所有新记录

在以前的版本中,一次创建多个记录的唯一方法是使用 createMany,它仅返回已创建记录的数量。

Prisma Client API 更加灵活的另一个例子是新的 omit 选项。它是 select 的对应项,可让您从查询的结果负载中排除字段

上面的查询将返回 User 模型的所有字段,但 password 字段除外。

类型化 SQL:类型安全的原生 SQL 查询

最后,今年我们交付的最令人兴奋的功能之一是编写类型安全的原生 SQL 查询的方法。通过此添加,Prisma ORM 现在为您提供了两全其美的优势:针对大多数查询的便捷的高级抽象,以及针对原生 SQL 的灵活的类型安全逃生舱口。

考虑一下您可能需要在应用程序中编写的原生 SQL 查询的示例

在生成步骤之后,您将能够通过 Prisma Client 中新的 $queryRawTyped 方法使用 conversionByVariant 查询

在我们的博客上了解更多信息:宣布类型化 SQL:使用 Prisma ORM 使您的原生 SQL 查询类型安全

还有一件事:Prisma Postgres — 与 Prisma ORM 一起使用的最佳数据库

尽管我们在 Prisma ORM 方面取得了巨大进展,但我们的亮点是最近推出的 Prisma Postgres — 与 Prisma ORM 一起使用的最佳数据库!

Prisma Postgres 是一项 托管 PostgreSQL 服务,可为开发者提供一个始终在线的数据库,并为存储和查询提供按需付费定价(没有固定成本,没有计算成本)。它就像一个无服务器数据库 — 但没有冷启动,并且有慷慨的免费套餐!

为了构建具有这些功能的服务,我们设计了一种独特的架构,该架构使用裸机机器、革命性的毫秒云堆栈和运行为超轻量级微型虚拟机(想想:“高度专业化的操作系统”)的unikernel

得益于 Prisma 产品的一流集成,Prisma Postgres 开箱即用,提供连接池、缓存、实时订阅和查询优化建议


试用 Prisma Postgres

感谢您的支持 💚

正是因为 — 我们了不起的社区 — 我们才能够创建TypeScript 生态系统中最受欢迎的 ORM

非常感谢大家一直以来的支持、反馈和意见,这有助于我们每天改进 Prisma。

如果您有任何想分享的内容,无论是帮助请求、激动人心的赞美还是建设性的反馈,您都可以随时在我们的 DiscordX 上联系我们。

✨ 我们一直在努力改进!如果您最近使用了 Prisma ORM,我们很乐意通过此2 分钟的调查听取您关于您的体验的想法。

不要错过下一篇文章!

注册 Prisma 新闻通讯