Prisma 查詢引擎,用 Rust 編寫,一直是 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 端。目前無法移動的元件正在被重新打包成一個 WASM 檔案,幷包含在 @prisma/client npm 模組中。這個 WASM 檔案充當查詢編譯器,簡化了工作流程,而無需進行重大的 API 更改。
例如,我們計劃取消對 binaryTargets 的要求,進一步簡化開發體驗。總的來說,Prisma ORM 的體驗將保持熟悉和直觀。
開啟未來的機遇
這次轉變不僅是為了解決當前的挑戰,它還為創新創造了新的機會。事實上,查詢編譯器為我們的團隊和社群探索了許多可能性。例如,引數化查詢計劃的使用可以允許儲存查詢計劃以供重複使用,從而加快執行速度。另一個途徑是在編譯時構建初始查詢計劃,進一步減少執行時計算需求。
我們對這些可能性感到興奮,並渴望聽到您的想法!歡迎在我們的 GitHub 或 Discord 上加入討論。
幫助我們構建更好的 Prisma ORM 體驗
這個專案是使 Prisma ORM 對每個人都更好邁出的重要一步。Prisma ORM 的核心是為像您這樣的開發者構建的。您的反饋和協作對這段旅程至關重要。
以下是您可以提供幫助的方式:
- 提交問題以報告錯誤或提出功能建議。
- 使用討論區分享您的想法。
- 加入我們的 Discord 參與社群活動和開發者 AMA。
最後,測試我們的早期訪問客戶端!我們將在 GitHub 和 Discord 上分享更新。
這是 Prisma 激動人心的時刻,未來還有更多的改進和機遇。感謝您激勵我們成長併成為這段旅程的一部分。
想成為第一批嘗試我們新的早期訪問客戶端的使用者嗎?在 X 上關注我們,並加入我們的 Discord 以獲取最新動態。
不要錯過下一篇文章!
訂閱 Prisma 新聞通訊