太長不看
今天我們釋出了 Prisma 2 的首個預覽版。它包含兩個主要工具,用於簡化和現代化資料庫工作流程
Photon 和 Lift 可以在您的應用程式中單獨使用,也可以一同使用。Prisma 2 將在預覽階段執行幾個月。請嘗試並分享您的反饋!
目錄
- 2019年的資料庫工作流程已經過時
- Prisma 2:下一代資料庫工具
- Prisma 2 入門
- 為什麼 Prisma 不同於現有資料庫工具/ORM
- Prisma 2 有哪些新功能?
- 穩定 Prisma 2 & 避免未來的重大變更
- 想要某個功能?分享您的反饋!
- Prisma Day 見
2019年的資料庫工作流程已經過時
近年來,應用程式開發的許多領域已得到現代化,以適應數字化時代帶來的新要求
- 前端 Web 應用程式通常由 DOM 的宣告式抽象(React、Vue 等)提供支援,而不是使用靜態 HTML 和 jQuery。
- 後端開發人員受益於 Node.js、Go 或 Elixir 等現代語言和執行時,以便為其用例做出正確的權衡。
- 計算過去通常在私有資料中心進行配置。如今,大多數工作負載都可以在公共雲中的容器或無伺服器環境中執行。
- 儲存解決方案正從自託管轉向 RDS 或 Azure Storage 等託管服務。
但開發人員每天處理的資料庫工作流程呢?從應用程式內部訪問資料庫或執行模式遷移的下一代工具是什麼?

對於資料庫訪問,開發人員可以使用傳統的 ORM(例如 Node.js 的 Sequelize 或 Go 的 GORM)。儘管它們通常有助於專案啟動,但隨著專案複雜性迅速超出傳統 ORM 的能力,它們並非長期的理想選擇。
模式遷移的工具和最佳實踐更加零散,組織傾向於開發自己的工具和流程來遷移資料庫模式。
Prisma 2:下一代資料庫工具
在過去三年中,我們幫助大型公司和個人開發人員解決了他們的資料訪問挑戰,我們很榮幸釋出一套工具,幫助開發人員在現代開發技術棧中與資料庫協作。
Prisma 2 包含兩個獨立的工具,用於解決資料訪問和遷移問題
讓我們更詳細地瞭解 Photon 和 Lift。
Photon – 替代傳統 ORM 的型別安全資料庫客戶端

Photon 是一個型別安全的資料庫客戶端,它根據 Prisma 資料模型(資料庫模式的表示形式)自動生成。它提供了一個強大且輕量級的對映程式碼層,您可以使用它在應用程式中與資料庫互動。
它擁有一個現代且符合人體工程學的資料訪問 API,專為應用程式開發人員的需求量身定製。您可以在 Photon 網站上探索 Photon API。
Lift – 宣告式資料建模 & 遷移

Lift 基於 Prisma 的宣告式資料模型定義,該定義將您的資料庫模式進行編碼。要遷移您的資料庫,您需要調整資料模型,並使用 Lift CLI “應用”更改。
每次遷移都透過一系列明確的步驟表示,這樣您就可以在整個專案生命週期中保留遷移歷史,並輕鬆地在不同遷移之間來回切換。遷移還可以透過 before/after 鉤子進行擴充套件。
更佳組合:Photon 和 Lift 工作流程的無縫整合
Photon 和 Lift 都可以在您的應用程式中單獨使用,無論是新專案還是現有專案。然而,它們都透過Prisma CLI 無縫整合,並能很好地協同工作。
這兩種工具的共同基礎是資料模型定義,它具有兩個職責:
- 對於Photon,它為生成的資料庫客戶端(CRUD API)提供模型。
- 對於Lift,它描述了底層資料庫的模式。
資料模型是 Photon 和 Lift 工作流程的核心。它充當您的資料庫模式和您用於與資料庫互動的程式設計 API 之間的中間抽象層。
Prisma 2 入門
更新(2020年1月): 本部落格文章的此部分已過時。Prisma 2 的設定說明自部落格文章首次釋出以來已更改。您可以在 GitHub 上的 Prisma 2 官方文件中開始使用。
1. 安裝 Prisma 2 CLI
您可以使用 npm 或 Yarn 安裝Prisma 2 CLI
2. 執行互動式 prisma2 init 流程 & 選擇樣板
執行以下命令開始:
在互動式提示中選擇以下內容:
- 選擇SQLite
- 選中兩個選項,Photon 和Lift
- 選擇TypeScript
- 選擇從頭開始
一旦執行完畢,init 命令就會為您建立一個初始專案設定。
進入hello-prisma2 目錄並安裝 Node 依賴。
3. 使用 Lift 遷移您的資料庫
使用 Lift 遷移資料庫遵循 2 步流程:
- 儲存新的遷移(遷移在檔案系統中表示為目錄)
- 執行遷移(實際遷移底層資料庫的模式)
在 CLI 命令中,這些步驟可以按如下方式執行 (CLI 步驟正在更新以匹配)
4. 使用 Photon 訪問您的資料庫
src/script.ts 中的指令碼包含一些示例 API 呼叫,例如:
您可以使用 package.json 中的 seed 指令碼來填充資料庫
您可以使用以下命令執行指令碼:
5. 構建應用程式
連線 Photon 到您的資料庫後,您現在可以開始構建應用程式了。在 photonjs 倉庫中,您可以找到以下用例的參考示例(適用於 JavaScript 和 TypeScript):
為什麼 Prisma 不同於現有資料庫工具/ORM
開發人員通常混合使用現有和自定義/手寫的資料庫工具來處理日常資料庫工作流程。Prisma 將主要的資料庫工作流程統一到一個連貫的生態系統中,從而提高開發人員的生產力。
Prisma 使用宣告式資料模型
使用 Prisma,您可以使用宣告式且易於理解的資料建模語法定義模型。定義的模型會對映到底層資料庫,同時為 Photon 生成的資料訪問 API 提供基礎。
這種方法的另一個主要優點是,資料模型定義可以提交到版本控制中,這樣整個團隊都能始終了解應用程式所基於的模型。
Photon 是一個型別安全、自動生成的資料庫客戶端
傳統的 ORM 通常無法滿足大型應用程式的複雜需求,但仍然需要資料對映層。典型的解決方案是為應用程式模型手動編寫自定義資料訪問層。
Photon 是自動生成的程式碼,它取代了您無論如何都需要為應用程式編寫的手動資料訪問層。自動生成可確保 API 的一致性,減少人為錯誤,並節省大量本用於編寫 CRUD 樣板程式碼的時間。
Photon 提供完全型別安全的 API(甚至適用於 JavaScript)。此 API 可用作構建更高階 ORM 模式(倉庫、活動記錄、實體等)的基礎。
注重開發者體驗 & 人體工程學
雖然大多數傳統 ORM 試圖簡單地將 SQL 抽象為一種程式語言,但 Photon 的資料訪問 API 是以開發人員為中心設計的。
特別是當處理關係時,Photon 的 API 比傳統 ORM 更具開發者友好性。JOIN 和原子事務被優雅地抽象為巢狀的 API 呼叫。以下是一些示例:
在文件中瞭解更多關於 Photon 關係 API 的資訊。
使用 Lift 為簡單和複雜用例提供安全且彈性的遷移
遷移資料庫模式可能是一個極其耗時且令人沮喪的經歷。Lift 為開發人員提供了一個簡單的遷移模型,它強大到足以應對最複雜的用例。
在絕大多數情況下,開發人員只需調整其宣告式資料模型定義以表示所需的資料庫結構,然後儲存並執行遷移。
每當此工作流程不符合您的需求時,您可以使用“before/after”鉤子來擴充套件它,以便在執行遷移之前或之後執行自定義程式碼。
遷移資料夾(以及資料庫中的遷移歷史表)讓開發人員能夠進一步輕鬆回滾遷移。
Lift 還旨在與 CI/CD 環境無縫協作。將來,Lift 將實現不可變模式部署(靈感來自 ZEIT 的不可變部署)。
Prisma 2 有哪些新功能?
Prisma 2 不僅將 Prisma 的主要工作流程拆分為獨立的工具,還對每個工具本身進行了根本性改進,併為未來的開發提供了強大的核心。
改進的資料模型語法 & 專案定義
在 Prisma 1 中,每個 Prisma 專案都需要兩個檔案:
prisma.yml:專案的根配置檔案datamodel.prisma:抽象資料庫併為生成的 Prisma 客戶端 API 提供基礎
在 Prisma 2 中,配置選項和資料模型已合併到一個單獨的Prisma 模式檔案中,通常稱為 schema.prisma。
開發人員在模式檔案中定義資料模型,並指定如何連線到各種資料來源以及目標程式碼生成器(例如 photonjs 生成器)。一個新的專案定義的簡單示例如下:
Prisma 2 還附帶一個VS Code 擴充套件,為資料建模語法提供自動格式化和語法高亮(更多功能如自動完成、跳轉定義和 linting 即將推出)!
在文件中瞭解更多關於改進的資料模型語法的詳情。
致 Prisma 1 使用者: 新的資料模型語法深受 SDL 啟發。它已針對描述資料庫模式進行了最佳化,但在大多數用例中,使用它會感覺與定義 Prisma 1 資料模型非常相似。在規範中瞭解更多。
Photon 中改進的資料訪問 API & 型別安全欄位選擇
Photon 提供了一個功能強大的資料訪問 API,與 Prisma 客戶端 API 相比,它進行了一些細微的更改和改進。在此處查詢完整的 API 文件。
統一訪問 CRUD 操作
CRUD 操作在模型之間是統一的,並且可以透過 Photon 例項上的屬性進行訪問,例如,對於模型 User,您可以按如下方式訪問讀寫資料的操作:
請注意,users 屬性的名稱是使用 pluralize 包生成的。您可以在文件中找到 Photon.js 的 API 參考。
透過 select 和 include 進行型別安全欄位選擇
Photon 資料訪問 API 中的一個全新功能是能夠以型別安全的方式精確指定 API 操作應返回的欄位。這可以透過可傳遞給任何 CRUD API 呼叫的兩個選項之一來完成:
請注意,
include尚未成為 Photon.js API 的一部分,但很快就會實現!
假設您的 Photon API 是根據以上資料模型生成的,以下是使用 select 和 include 的示例:
此程式碼片段僅突出顯示 findOne 的 select 和 include,但您可以將這些選項提供給任何其他 CRUD 操作:findMany、create、update 和 delete。
您可以在文件中瞭解更多關於 Photon.js 欄位選擇 API 的資訊。
使 Prisma 伺服器成為可選
Prisma 1 中作為資料庫代理所需的 Prisma 伺服器現在是可選的。
這是由於一個根本性的架構變化:以前在 Prisma 伺服器內部執行的查詢和遷移引擎現在可以作為普通二進位制檔案與您的應用程式在同一主機上執行。

Prisma 核心已用 Rust 重寫
Prisma 1 是用 Scala 實現的,這意味著它需要在 JVM 中執行。為了減少執行 Prisma 的開銷,我們決定用 Rust 重寫它。
Rust 的優點包括顯著降低記憶體佔用、更好的效能,並且不再需要部署、監控和維護額外的伺服器來執行 Prisma 2。
Rust 已被證明是 Prisma 的完美語言,使我們能夠編寫安全且效能極高的程式碼。
穩定 Prisma 2 & 避免未來的重大變更
儘管 Prisma 2 引入了許多重大變更,但我們堅信這些變更也帶來了根本性改進,對於實現我們為簡單和複雜應用程式構建現代化資料層的願景是必要的。
我們在預覽期投入了大量精力,以確保未來建立在穩定的基礎之上。在預覽期間,可能仍然會有重大變更。在 GA 版本釋出後,我們承諾提供穩定、非破壞性的 API。
請透過報告您遇到的任何問題並提出文件中未解決的問題來幫助我們。
我們正在計劃釋出一系列部落格文章,深入探討 Prisma 2 的特定部分。這包括 Rust 重寫、Lift 的內部工作原理等主題,以及闡述我們許多技術決策動因和核心設計原則的文章。
想要某個功能?分享您的反饋!
我們對 Prisma 2 的現狀感到非常興奮,但我們不想止步於此。我們知道我們做出的一些決定可能會有爭議,所以如果您有強烈意見,請加入討論,分享您的想法、建議和反饋!
如果您想產生影響並幫助塑造 Prisma 2 最終的模樣,現在正是加入的最佳時機!請在 Slack 上的#prisma2-preview 頻道中留下您的反饋,或在 lift 或 photonjs 倉庫中提出問題。
Prisma Day 見
Prisma 2 預覽版並不是本週唯一令人興奮的事情。我們對即將到來的三天會議感到非常興奮:
- Prisma Day(已售罄)
- GraphQL Conf(晚鳥票仍在發售)
我們尤其期待在 Prisma Day 歡迎 Prisma 社群,共同度過充滿啟發性演講和精彩對話的一天。明天見!🙌
不要錯過下一篇文章!
訂閱 Prisma 新聞通訊
