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/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 连接和 消息流水线,而 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 无服务器驱动程序,请务必 填写我们的调查,以便您有机会获得我们 Edge Function 支持的早期访问权限。我们将很快公布最新消息。

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

不要错过下一篇文章!

订阅 Prisma 新闻邮件

© . All rights reserved.