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 請求,從而大幅簡化 Function-as-a-Service (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 無伺服器驅動程式,請務必提交對我們 調查的回應,以便您也被考慮搶先體驗我們的 edge function 支援。我們很快就會發布消息。

我們很想知道您的想法!試用 driverAdapters 預覽功能,並透過我們的 GitHub 討論區(針對 NeonPlanetScale)或我們的 Discord 傳達您的任何意見回饋。

不要錯過下一篇文章!

註冊 Prisma 電子報