2024年8月27日

发布 TypedSQL:使用 Prisma ORM 让你的原生 SQL 查询获得类型安全

随着今日 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 查询时为你提供出色的开发者体验(DX)。以下是它的工作原理

  1. .sql 文件中编写 SQL 查询,并将其放入 prisma/sql 目录

    你也可以创建带有参数的 SQL 查询!

  2. 使用 prisma generate 命令的 --sql 标志生成查询函数

  3. @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 原生查询的开发者体验(DX),例如通过使用 Kysely 查询构建器 Prisma Client 扩展SafeQL,但我们希望以原生方式解决此问题。

Prisma ORM 新功能:TypedSQL 🎉

这就是为什么我们很高兴推出 TypedSQL,它是 Prisma ORM 中的一个新工作流程,为原生 SQL 查询提供类型安全。TypedSQL 的灵感来源于 PgTypedsqlx 等基于类似想法的项目。

使用 TypedSQL,Prisma ORM 现在为你提供两全其美的体验

  • 使开发者提高生产力并能满足项目中大多数查询需求的高级抽象。
  • 当你需要直接编写 SQL 时,一个令人愉悦且类型安全的退出通道。

它还允许拥有不同偏好的开发团队选择他们最喜欢的方式:你的团队里是否有死忠的 SQL 粉丝,同时也有一些人对 SQL 避之不及?

Prisma ORM 现在可以在不牺牲开发者体验(DX)或灵活性的情况下满足这两类人的需求!

试试看并分享你的反馈

今后,当你需要使用 $queryRaw 时,TypedSQL 将成为你的新伴侣。

我们认为 TypedSQL 是 SQL 查询构建器的演进,它消除了所有抽象,从而为开发者提供了更大的数据库查询灵活性。


试试 TypedSQL

我们非常希望你试试 TypedSQL,并在 XDiscord 上告诉我们你的想法!

不要错过下一篇文章!

订阅 Prisma 时事通讯