2023 年 10 月 6 日

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

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

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

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

传统上,数据库驱动程序与数据库建立长期存在的 TCP 连接以进行通信。即使 TCP 连接在开始时有一些开销,但持续通信几乎没有开销,使其成为有服务器部署的理想选择。

但是,长期存在的连接可能会在无服务器环境中引起问题。鉴于无服务器功能的短暂性,跟踪连接、关闭空闲连接、处理僵尸连接以及维护内部连接池,以避免数据库不堪重负,可能会成为一件繁琐的事情。最重要的是,越来越多的云提供商不允许任意 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 的一个关键部分一直是查询引擎。查询引擎用 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)连接到这些数据库。今天,通过引入 驱动程序适配器,这两个问题都得到了解决,这使得 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/serverlessws,以设置供 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 连接和 消息管道,而 Prisma 涵盖连接创建和销毁、错误处理和类型安全。如果您对我们的 Neon 无服务器驱动程序支持有任何反馈,请在我们的 专用 GitHub 问题 上留下评论,我们将在继续开发时使用它。

将 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 问题 上留下评论,我们将在继续开发时使用它。


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

总结

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

Prisma Client 和新的驱动程序适配器功能目前尚不支持 Edge Functions 部署,例如 CloudFlare Workers 或 Vercel Edge Functions。如果您想在 Edge Functions 环境中测试 Neon 或 PlanetScale 无服务器驱动程序,请务必回复我们的调查,以便您将被考虑提前访问我们的边缘函数支持。我们很快就会发布消息。

我们很想知道您的想法!试用 driverAdapters 预览功能,并通过我们的 GitHub 讨论区为 NeonPlanetScale 或我们的 Discord 传递您收到的任何反馈。

不要错过下一篇文章!

注册 Prisma 新闻通讯