随着今天 v5.19.0 版本的发布,Prisma ORM 引入了一种新的方式来以类型安全的方式编写原生 SQL 查询!现在,使用 Prisma ORM,您可以兼得两全其美:对于大多数查询而言,它提供了便捷的高级抽象,同时也是原生 SQL 的灵活、类型安全的逃生通道。

TL;DR: 我们让原生 SQL 完全类型安全
我们相信,通过 Prisma ORM,我们设计出了最佳 API,可以编写占大多数应用 95% 的常规 CRUD 查询!
对于剩下的 5% —— 那些无法通过 Prisma Client API 表达或需要极致性能的复杂查询 —— 我们提供了一个较低级别的 API 来编写原生 SQL。然而,这个逃生通道不提供类型安全,开发者也因此错失了 Prisma ORM 带来的出色开发体验(DX),所以我们一直在寻找更好的方法!
随着今天 Prisma ORM v5.19.0 版本的发布,我们激动地宣布 TypedSQL:编写复杂和高性能查询的最佳方式。TypedSQL 只是 SQL,但更胜一筹。它是完全类型安全的,提供自动补全,并在您需要编写原生 SQL 查询时提供出色的开发体验。它的工作方式如下:
-
在
.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 查询构建器扩展用于 Prisma Client 或 SafeQL,但我们希望以原生方式解决这个问题。
Prisma ORM 新增功能:TypedSQL 🎉
因此,我们很高兴推出 TypedSQL,这是 Prisma ORM 中一个新的工作流程,为原生 SQL 查询提供类型安全。TypedSQL 的灵感来源于 PgTyped 和 sqlx 等基于类似理念的项目。
有了 TypedSQL,Prisma ORM 现在让您两全其美:
- 一种更高级的抽象,可提高开发者的生产力,并能满足项目中大多数查询的需求。
- 当您需要直接编写 SQL 时,一个令人愉悦且类型安全的逃生通道。
它还为拥有不同偏好的开发团队提供了选择自己喜欢方法的选项:您的团队中是否有狂热的 SQL 爱好者,但也有人对 SQL 避之不及?
现在,Prisma ORM 可以在不牺牲开发体验或灵活性的前提下,满足两类团队的需求!
立即试用并分享您的反馈
每当您过去不得不使用 $queryRaw
时,TypedSQL 现在是您的新伙伴。
我们将 TypedSQL 视为 SQL 查询构建器的演进,因为它消除了所有抽象,让开发者在数据库查询方面拥有更大的灵活性。
试用 TypedSQL
我们非常希望您能试用 TypedSQL,并在 X 和 Discord 上告诉我们您的想法!
不要错过下一篇文章!
订阅 Prisma 时事通讯