随着今天 v5.19.0 版本的发布,Prisma ORM 引入了一种以类型安全方式编写原始 SQL 查询的新方法!您现在可以通过 Prisma ORM 获得两全其美的体验:方便的高级抽象用于大多数查询,以及灵活、类型安全的原始 SQL 备用方案。

TL;DR: 我们让原始 SQL 完全类型安全
通过 Prisma ORM,我们设计了我们认为最好的 API 来编写常规的 CRUD 查询,这些查询占大多数应用程序的 95%!
对于剩下的 5%——那些无法用 Prisma Client API 表达或需要最大性能的复杂查询——我们提供了一个较低级别的 API 来编写原始 SQL。然而,这个备用方案不提供类型安全,开发人员错过了他们习惯于从 Prisma ORM 获得的出色开发体验 (DX),所以我们寻找了一种更好的方法!
随着今天 Prisma ORM v5.19.0 版本的发布,我们很高兴宣布推出 TypedSQL:编写复杂且高性能查询的最佳方式。 TypedSQL 只是 SQL,但更好。 它完全类型安全,提供自动补全,并在您需要编写原始 SQL 查询时提供出色的 DX。它的工作原理如下:
-
将 SQL 查询写入
.sql文件并将其放入prisma/sql目录您还可以创建带参数的 SQL 查询!
-
通过在
prisma generate上使用--sql标志来生成查询函数 -
从
@prisma/client/sql导入查询函数……并在新的
$queryRawTyped函数中调用它以获得完全类型化的结果 😎如果您的 SQL 查询有参数,它们会提供给传递给
$queryRawTyped的查询函数
Prisma Client API 与 TypedSQL 结合,为 CRUD 操作和高度复杂查询提供了最佳体验。通过此新增功能,我们希望您再也无需使用 SQL 查询构建器!
提高生产力的高级抽象
原始 SQL 仍然是查询关系数据库中数据最强大和最灵活的方式。但它也有一些缺点。
原始 SQL 的缺点
如果您以前在 TypeScript 项目中编写过原始 SQL,您可能知道它并没有提供最好的 DX
- 编写 SQL 查询时没有自动补全。
- 查询结果没有类型安全。
- 编写和调试复杂 SQL 查询的复杂性。
- 开发团队通常具有不同级别的 SQL 经验,并非团队中的每个人都精通 SQL 编写。
- SQL 使用与 TypeScript(对象)不同的数据模型(关系),需要将一个映射到另一个;这在模型之间的关系方面尤为突出,这些关系在 SQL 中通过外键表示,但在 TypeScript 中表示为嵌套对象。
应用程序开发人员应该关注数据——而不是 SQL
在 Prisma,我们坚信应用程序开发人员应该关注数据——而不是 SQL。
典型的应用程序开发人员编写的大多数查询都使用相当有限的功能集,通常与常见的 CRUD 操作相关,例如分页、过滤器或嵌套查询。
我们的主要目标是确保应用程序开发人员可以快速获取所需数据,而无需过多考虑查询以及数据库中的行与代码中对象的映射。
使用 Prisma ORM 快速交付
这就是我们构建 Prisma ORM 的原因,旨在为开发人员提供一种抽象,让他们提高生产力并快速交付!以下是使用 Prisma ORM 的典型工作流程概述。
首先,您在人类可读的 schema 中定义数据模型
使用 Prisma CLI,您可以生成一个(可自定义的)SQL 迁移并针对您的数据库运行迁移。一旦 schema 映射到您的数据库,您就可以使用 Prisma Client 查询它
备用方案:回退到原始 SQL
虽然我们相信这种更高级别的抽象能提高开发人员的生产力,但我们发现许多项目需要编写原始 SQL 的选项。这通常发生在以下情况:
- Prisma Client API 不够灵活,无法表达某个查询。
- 查询需要进行速度优化。
在这些情况下,Prisma ORM 通过使用 Prisma Client 的 $queryRaw 方法提供原始 SQL 的备用方案
这种方法的主要问题是查询不是类型安全的。如果开发人员想要享受标准 Prisma Client API 带来的类型安全优势,他们需要手动编写此查询的返回类型,这可能既繁琐又耗时。另一个问题是这些手动定义的类型不会随着 schema 更改而自动更新,这引入了另一种错误的可能性。
虽然有方法可以改进使用 Prisma ORM 原始查询的开发体验,例如使用 Kysely query builder extension for Prisma Client 或 SafeQL,但我们希望以原生方式解决这个问题。
Prisma ORM 新功能:TypedSQL 🎉
这就是我们很高兴推出 TypedSQL 的原因,它是 Prisma ORM 中一个新的工作流程,为原始 SQL 查询提供类型安全。TypedSQL 的灵感来自 PgTyped 和 sqlx 等基于类似理念的项目。
通过 TypedSQL,Prisma ORM 现在为您提供两全其美的体验
- 一种更高级别的抽象,可提高开发人员的生产力,并可满足项目中大多数查询的需求。
- 一种令人愉悦且类型安全的备用方案,适用于您需要直接编写 SQL 的情况。
它还为拥有不同偏好的开发团队提供了选择他们喜欢的方法的选项:您的团队中是否有一位狂热的 SQL 粉丝,但也有一些人根本不想碰 SQL?
Prisma ORM 现在可以在不牺牲 DX 或灵活性的情况下满足这两个群体的需求!
试用并分享您的反馈
每当您过去不得不求助于使用 $queryRaw 时,TypedSQL 都是您新的伴侣。
我们将 TypedSQL 视为 SQL 查询构建器的演进,因为它消除了所有抽象,为开发人员在数据库查询中提供了更大的灵活性。
尝试 TypedSQL
我们很乐意邀请您试用 TypedSQL,并在 X 和 Discord 上告诉我们您的看法!
不要错过下一篇文章!
订阅 Prisma 新闻通讯