在今天的 v5.19.0 版本中,Prisma ORM 引入了一种以类型安全的方式编写原始 SQL 查询的新方法!现在,您可以通过 Prisma ORM 获得两全其美的优势:适用于大多数查询的便捷高级抽象,以及 适用于原始 SQL 的灵活、类型安全的逃生舱口。

TL;DR:我们使原始 SQL 完全类型安全
通过 Prisma ORM,我们设计了我们认为编写构成大多数应用程序 95% 的常规 CRUD 查询的最佳 API!
对于剩余的 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 的原始查询来改进 DX,例如,通过使用 Prisma Client 的 Kysely 查询构建器扩展 或 SafeQL,我们希望以原生方式解决此问题。
Prisma ORM 新功能:TypedSQL 🎉
这就是为什么我们很高兴推出 TypedSQL,这是 Prisma ORM 中的一个新工作流程,可为您提供原始 SQL 查询的类型安全性。TypedSQL 的灵感来自 PgTyped 和 sqlx 等基于类似想法的项目。
通过 TypedSQL,Prisma ORM 现在为您提供两全其美的优势
- 一个更高级别的抽象,可以提高开发人员的生产力,并可以服务于项目中的大多数查询。
- 当您需要直接编写 SQL 时,一个令人愉悦且类型安全的逃生舱口。
它还为开发团队(其中个别开发人员有不同的偏好)提供了选择他们最喜欢的方法的选项:您的团队中是否有一位铁杆 SQL 粉丝工程师,但也有一些人不愿意用十英尺长的杆子触碰 SQL?
Prisma ORM 现在为这两个群体提供了他们想要的东西,而不会牺牲 DX 或灵活性!
试用并分享您的反馈
TypedSQL 是您在过去会求助于使用 $queryRaw
时的新伙伴。
我们将 TypedSQL 视为 SQL 查询构建器的演变,因为它消除了所有抽象,从而为开发人员提供了更大的数据库查询灵活性。
试用 TypedSQL
我们希望您试用 TypedSQL,并在 X 和 Discord 上告诉我们您的想法!
不要错过下一篇文章!
注册 Prisma 新闻通讯