2024年8月27日

宣布 TypedSQL:使用 Prisma ORM 让您的原生 SQL 查询类型安全

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

Announcing TypedSQL: Make your raw SQL queries type-safe with Prisma ORM

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 查询时提供出色的开发体验。它的工作方式如下:

  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 原生查询的开发体验,例如使用 Kysely 查询构建器扩展用于 Prisma ClientSafeQL,但我们希望以原生方式解决这个问题。

Prisma ORM 新增功能:TypedSQL 🎉

因此,我们很高兴推出 TypedSQL,这是 Prisma ORM 中一个新的工作流程,为原生 SQL 查询提供类型安全。TypedSQL 的灵感来源于 PgTyped 和 sqlx 等基于类似理念的项目。

有了 TypedSQL,Prisma ORM 现在让您两全其美:

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

它还为拥有不同偏好的开发团队提供了选择自己喜欢方法的选项:您的团队中是否有狂热的 SQL 爱好者,但也有人对 SQL 避之不及?

现在,Prisma ORM 可以在不牺牲开发体验或灵活性的前提下,满足两类团队的需求!

立即试用并分享您的反馈

每当您过去不得不使用 $queryRaw 时,TypedSQL 现在是您的新伙伴。

我们将 TypedSQL 视为 SQL 查询构建器的演进,因为它消除了所有抽象,让开发者在数据库查询方面拥有更大的灵活性。


试用 TypedSQL

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

不要错过下一篇文章!

订阅 Prisma 时事通讯

© . All rights reserved.