2023 年 10 月 06 日

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 会感觉非常熟悉,只不过现在它利用了您选择的数据库客户端,并通过 HTTP 连接与数据库通信,而无需使用 TCP 连接。

总结

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

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

我们很想知道您的想法!试用 driverAdapters 预览功能,并通过我们的 GitHub 讨论(针对 NeonPlanetScale)或在我们的 Discord 上提交您有的任何反馈。

不要错过下一篇文章!

订阅 Prisma 新闻通讯

© . This site is unofficial and not affiliated with Prisma Data, Inc.