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 新聞郵件

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