2023年10月6日

Prisma ORM 现已支持无服务器数据库驱动程序(预览版)

Prisma 现已发布对 NeonPlanetScale 无服务器数据库驱动程序的预览支持。此功能允许 Prisma 用户利用现有的数据库驱动程序与数据库通信,而无需建立长期 TCP 连接!

Support for Serverless Database Drivers in Prisma ORM Is Now in Preview

什么是无服务器数据库驱动程序?

传统上,数据库驱动程序会与数据库建立长期 TCP 连接进行通信。尽管 TCP 连接在开始时有一些开销,但持续通信的开销很小或没有,这使得它非常适合服务器部署(serverful deployments)。

然而,长期连接在无服务器环境中可能会导致问题。考虑到无服务器函数的临时性(ephemeral nature),跟踪连接、关闭空闲连接、处理僵尸连接以及维护内部连接池以防止数据库过载会变得很麻烦。除此之外,越来越多的云提供商不允许任意 TCP 连接,这使得使用依赖 TCP 连接的现有数据库变得具有挑战性。

Using a traditional database with serverless functions can quickly lead to an overwhelmed database.

无服务器函数可能很快耗尽数据库连接

为了解决上述问题,Prisma 开发了 Prisma Accelerate,以便为运行在无服务器函数上的应用程序提供更好的体验。此外,一些数据库提供商也开发了自己的数据库驱动程序库。这些驱动程序使用不同的协议(例如 HTTP 或 WebSocket)而不是传统的 TCP 连接进行通信,因此非常适合快速发展的无服务器环境。

那么,这些无服务器驱动程序如何与 Prisma 集成呢?

Prisma ORM 现已支持无服务器驱动程序

自首次发布以来,Prisma ORM 的一个关键部分就是查询引擎 (Query Engine)。查询引擎用 Rust 编写,可以将 Prisma Client 查询可靠且高效地转换为 SQL 语句,然后通过内置的数据库驱动程序执行这些语句。这个系统过去运行良好,但在几个月前,我们注意到一种趋势:新的数据库提供商提供了用 JavaScript 编写的无服务器数据库驱动程序,这些驱动程序通过 HTTP 与特殊端点通信。我们的团队知道,构建基于 Rust 的实现来与这些新端点通信将是一项巨大的工程。

A diagram showing Prisma Client using Prisma's Query Engine to open long-lived TCP connections to a database

Prisma Client 在没有驱动程序适配器的情况下与数据库通信。

此外,虽然 Prisma ORM 支持许多数据库引擎和提供商,但它只能通过直接 TCP 连接或连接池器(如 Prisma Accelerate)连接到这些数据库。今天,随着 驱动程序适配器(driver adapters) 的引入,这两个问题都得到了解决,驱动程序适配器使 Prisma ORM 能够在连接到受支持的数据库时使用现有的 JavaScript 数据库驱动程序。

今天,我们发布了两个驱动程序适配器:@prisma/adapter-neon@prisma/adapter-planetscale。这些适配器充当 Prisma Client 和 JavaScript 无服务器数据库驱动程序之间的翻译器。如果您使用数据库驱动程序和驱动程序适配器,您的应用程序不再需要与数据库建立直接 TCP 连接即可工作,而是通过 HTTP 或 WebSocket 连接与数据库通信。Prisma 使用 Rust 引擎将 Prisma Client 查询转换为 SQL,然后通过这些驱动程序运行这些查询。通过这种设置,我们能够提供两全其美的优势:一个经过实战检验的查询引擎,以及在基于 Prisma 的代码库中使用越来越多的提供商的能力。

A diagram showing Prisma Client using Prisma's Query Engine translate queries but a separate database driver to communicate.

Prisma Client 使用驱动程序适配器和无服务器数据库驱动程序与数据库通信。

现在,唯一的条件是能够发起 HTTP 或 WebSocket 请求,极大地简化了函数即服务 (FaaS) 部署。

如何在 Prisma ORM 中使用无服务器数据库驱动程序

将 Prisma 配置为使用 Neon 或 PlanetScale 无服务器数据库驱动程序非常简单

  1. 像往常一样设置您的数据库驱动程序
  2. 将其传递给相应的 Prisma 驱动程序适配器
  3. 使用该驱动程序适配器创建 Prisma Client 实例

首先,安装 prisma@prisma/client,版本至少为 5.4.1。同时安装 dotenv,以便 .env 文件中定义的任何环境变量都可以通过脚本中的 process.env 访问。

现在,您可以按如下方式设置 Prisma Client。

将 Neon 与 @neondatabase/serverless 一起使用

The logo of neon.tech

Neon 上创建数据库后,您需要安装 @prisma/adapter-neon 驱动程序适配器、Neon 的无服务器数据库驱动程序 @neondatabase/serverless 以及 ws,以便 Neon 使用 WebSocket 连接。

然后确保您的 Neon 数据库连接字符串已复制到您的 .env 文件中。连接字符串将以 postgres:// 开头。

您现在可以在 schema.prisma 数据源中引用此环境变量。确保您还包含了 driverAdapters 预览功能。

现在运行 npx prisma generate 以重新生成 Prisma Client,并在您的应用程序中启用预览功能。

完成以上设置后,您可以继续在脚本中操作

  1. 导入包
  2. 设置 Neon 无服务器数据库驱动程序
  3. 使用 Neon 无服务器数据库驱动程序实例化 Prisma Neon 适配器
  4. 将驱动程序适配器传递给 Prisma Client 实例

现在,您的代码具有 Neon 无服务器驱动程序的内置优势,例如 WebSocket 连接和 消息流水线(message pipelining),而 Prisma 则负责连接的创建和销毁、错误处理和类型安全。如果您对我们的 Neon 无服务器驱动程序支持有任何反馈,请在我们专门的 GitHub issue 上留言,我们将以此为基础继续开发。

将 PlanetScale 与 @planetscale/database 一起使用

The logo of planetscale.com

开始使用 PlanetScale 后,您可以使用 PlanetScale 无服务器驱动程序连接到您的数据库。您需要安装 @prisma/adapter-planetscale 驱动程序适配器、@planetscale/database 无服务器驱动程序以及 undici,以为 PlanetScale 驱动程序提供 fetch 函数。

然后确保您的 PlanetScale 数据库连接字符串已复制到您的 .env 文件中。连接字符串将以 mysql:// 开头

您现在可以在 schema.prisma 数据源中引用此环境变量。确保您还包含了 driverAdapters 预览功能。

现在运行 npx prisma generate 以重新生成 Prisma Client,并在您的应用程序中启用预览功能。

您的 Prisma Client 实例现在使用 PlanetScale 的 database-js,它可以提高连接的可靠性和性能。它使用 HTTP 请求代替 Prisma 的连接池,但 Prisma 将继续处理错误处理和类型安全。如果您对我们的 PlanetScale 无服务器驱动程序支持有任何反馈,请在我们专门的 GitHub issue 上留言,我们将以此为基础继续开发。


虽然数据库驱动程序和驱动程序适配器的设置与我们现有的入门指南不同,但您的 Prisma Client 使用起来会非常熟悉,不同之处在于它现在利用了您选择的数据库客户端,并在不使用 TCP 连接的情况下与数据库通信。

总结

我们很高兴 Prisma 用户现在可以利用 Neon 和 PlanetScale 无服务器数据库驱动程序。这些驱动程序非常适合无服务器环境或无法建立长期 TCP 连接的区域。

Prisma Client 和新的驱动程序适配器功能目前尚不支持 Edge Functions 部署,例如 CloudFlare Workers 或 Vercel Edge Functions。如果您想在 Edge Functions 环境中测试 Neon 或 PlanetScale 无服务器驱动程序,请务必提交问卷回复,以便我们考虑让您抢先体验(Early Access)我们的 edge function 支持。我们将很快发布最新消息。

我们非常想知道您的想法!请试用 driverAdapters 预览功能,并通过我们针对 NeonPlanetScale 的 GitHub 讨论区或在我们的 Discord 上提供任何反馈。

不要错过下一篇文章!

订阅 Prisma 新闻通讯