以 Rust 撰寫的 Prisma 查詢引擎一直是 Prisma ORM 的核心部分。它的開發是為了未來,但不再與 Prisma ORM 目前的方向相容。請繼續閱讀以了解更多關於我們從 Rust 重寫為 TypeScript 的資訊。
Prisma 現在在做什麼?!
在我們最近發布的 ORM 宣言中,我們描述了 Prisma ORM 在未來幾個月和幾年內的管理方式。其中一小部分包含以下內容
我們正在透過將 Prisma 的核心邏輯從 Rust 遷移到 TypeScript,並重新設計 ORM,以使自訂和擴充更容易,來解決這個問題。
這可能只是我們文章中的一句話,但它引起了很多反應
例如,我們真的很喜歡 Theo 的這個影片
總而言之,這些都是相當合理的反應。Rust 查詢引擎從一開始就與 Prisma ORM 同在。我們在網路上看到的討論很棒,但我們也想介入並在我們的 TypeScript 實作接近搶先體驗階段時提供一些更新。
簡而言之,我們想讓社群中的每個人都知道正在發生的變化、這些變化背後的動機,以及這些變化將如何實施。
為什麼 Prisma 選擇 Rust?
在我們可以探索 Prisma ORM 的未來之前,我們需要了解為什麼 Prisma ORM 使用 Rust 引擎。當我們開始規劃 Prisma 2(現在稱為 Prisma ORM)時,我們有一個非常清晰的願景:我們想要為盡可能多的語言建構 ORM — TypeScript、Go、Python、Scala、Rust 和其他語言。我們需要一個解決方案,可以使新增對新語言的支援相對簡單。Rust 的效能優勢和系統級方法使其成為這個核心查詢引擎的自然選擇。
這個決定也是對 GraphCool 和 Prisma 1 所做工作的延續。這些早期解決方案的核心、可部署基礎架構演變為基於 Rust 的查詢引擎 — 一個旨在處理產生 SQL 查詢、管理連線池以及從資料庫傳回結果等繁重工作的二進位檔案。這使 prisma-client-js
等特定語言的用戶端保持在引擎之上的輕量級層。
為什麼要放棄 Rust?
雖然擁有強大的 Rust 引擎幫助我們快速提供出色的效能,但我們後來發現它帶來了一些顯著的挑戰
- 技能門檻: 貢獻查詢引擎需要 Rust 和 TypeScript 的熟練程度,從而減少了社群參與的機會。
- 部署複雜性: 每個作業系統和 OpenSSL 程式庫版本都需要自己的二進位檔案,這使部署變得複雜並減慢了開發速度。
- 相容性問題: 現代 JavaScript 執行階段、無伺服器和邊緣環境並不總是與大型 Rust 二進位檔案相容,這限制了 Prisma 的部署方式和位置。
此外,查詢引擎的核心優勢 — 支援多個用戶端的能力 — 不再是我們的重點。Prisma ORM 是一個 TypeScript 專案,雖然我們支援我們的社群用戶端,但我們不會在內部開發它們。
考慮到這些因素,並加入我們對建立一個包容性的、社群驅動的生態系統的承諾(正如我們的 ORM 宣言 中概述的那樣),我們決定將盡可能多的部分從我們的 Rust 查詢引擎遷移到 TypeScript — 在不犧牲 Prisma ORM 使用者所知和喜愛的開發人員體驗的情況下,簡化貢獻並減少部署難題。
重新定義查詢執行
我們在搶先體驗階段引入的主要架構變更包括將查詢執行和資料庫結果處理從 Rust 移至 TypeScript。
為了理解這個變更,讓我們回顧一下目前的查詢引擎設定。
今天 Prisma ORM 查詢的執行
今天,有兩種方法可以使用 Prisma ORM 查詢資料庫
- 使用以 Rust 撰寫的資料庫驅動程式。
- 使用以 TypeScript 撰寫的驅動程式介面卡和驅動程式。
在第一種方法中,Prisma ORM 查詢被傳遞到以 Rust 撰寫的查詢引擎。這個引擎管理從建立查詢計畫到執行查詢以及將結果傳回 JavaScript 用戶端的所有事情
但是,這種架構無法支援僅提供 JavaScript 驅動程式的資料庫,例如 D1 和 Turso。為了解決這個限制,我們引入了驅動程式介面卡。
當使用驅動程式介面卡時,查詢引擎仍然開發查詢計畫並產生 SQL 陳述式。但是,執行透過驅動程式介面卡委派給資料庫
這種方法能夠與 JavaScript 驅動程式相容,但引入了一個權衡:資料必須從 JavaScript 序列化到 Rust,然後再序列化回 JavaScript,從而降低效率並抵消了這種方法的一些優勢。
明天 Prisma ORM 查詢的執行
在新的架構中,驅動程式介面卡將繼續使用。但是,Prisma ORM 不再依賴基於 Rust 的查詢引擎,而是將查詢傳遞給 WASM 編譯器,後者將傳回查詢計畫。然後,這個計畫將完全在 TypeScript 中執行
這種簡化的架構帶來了幾個直接的好處
- 保留對經過驗證的 JavaScript 資料庫驅動程式的支援。
- 減少 JavaScript 和 Rust 之間資料轉換的需求。
- 最大限度地減少 Rust 和 JavaScript 之間傳輸的資料量。
- 消除運送外部二進位檔案的需求,因為查詢編譯器不再依賴於系統特定的實用程式。
透過將查詢執行轉移到 TypeScript,我們簡化了架構,並增強了開發人員的相容性和效能。
即將推出的簡化體驗
跨語言移動邏輯是一個重大的轉型,但我們正在逐步進行,以最大限度地減少中斷。雖然這些變更是實質性的,但我們的首要任務是確保平穩過渡,以保持您對 Prisma 期望的簡潔性和可靠性。在這次遷移中,我們不僅解決了今天的挑戰,而且還為增強開發人員體驗奠定了基礎。
邁向平穩過渡的步驟
我們的工程團隊正在逐步將查詢引擎邏輯轉移到程式碼庫的 TypeScript 端。目前無法移動的元件正在重新封裝到包含在 @prisma/client
npm 模組中的 WASM 檔案中。這個 WASM 檔案充當查詢編譯器,簡化工作流程,而不會造成重大的 API 變更。
例如,我們計劃移除對 binaryTargets
的需求,進一步簡化開發人員體驗。總體而言,Prisma ORM 體驗將保持熟悉和直觀。
解鎖未來的機會
這種轉型不僅僅是為了應對目前的挑戰 — 它為創新創造了新的機會。事實上,查詢編譯器為我們的團隊和社群探索提供了許多可能性。例如,使用參數化查詢計畫可以儲存查詢計畫以供重複使用,從而加快執行速度。另一種途徑是在編譯時建立初始查詢計畫,進一步減少執行階段的計算需求。
我們對這些可能性感到興奮,並渴望聽到您的想法!加入我們 GitHub 或 Discord 上的討論。
幫助我們建立更好的 Prisma ORM 體驗
這個專案是朝著使 Prisma ORM 對每個人都更好的方向邁出的重要一步。Prisma ORM 的核心是為像您這樣的開發人員而建構的。您的回饋和協作對於這個旅程至關重要。
以下是您可以提供幫助的方式
- 提交 issue 以報告錯誤或建議功能。
- 使用討論區 分享您的想法。
- 加入我們的 Discord 以參與社群活動和開發者 AMA。
最後,測試我們的搶先體驗用戶端!我們將在 GitHub 和 Discord 上分享更新。
對於 Prisma 來說,這是一個令人興奮的時刻,未來將有更多改進和機會。感謝您激勵我們成長,並成為這個旅程的一部分。
想成為第一批試用我們新的搶先體驗用戶端的人嗎?在 X 上關注我們 並 加入我們的 Discord 以保持更新。
不要錯過下一篇文章!
訂閱 Prisma 電子報