第 1 篇:Prisma 是什麼?

如果你寫過後端,一定遇到過下面這些問題:SQL 語句到處散落、欄位名稱和類型全靠記憶、重構表結構非常心驚膽跳。Prisma 想做的,就是給你一個強型別、現代化、可維護的資料存取層。
1. Prisma 到底是什麼
我們先用一句話概括:Prisma 是面向 TypeScript/JavaScript 的現代 ORM 和資料存取工具鏈,核心目標是:
用一個統一的 Schema 描述業務資料模型;
自動生成型別安全的資料庫客戶端;
提供可控的資料庫遷移機制,讓演進資料庫更可預期。
傳統 ORM 會把「物件」和「表」一一映射,強調「像操作物件一樣操作資料庫」;Prisma 更像是在說:你用一種宣告式 DSL 描述你的「資料世界」,剩下的交給工具鏈來保證安全與一致性。
Prisma 當前主要支援的執行環境包括:
Node.js(常見 Web 服務場景);
一些 Bun / Deno 等執行時(在支援 Node 生態的前提下)。
2. Prisma 的三大核心元件
理解 Prisma 最重要的,是把握住它的三個核心角色:Schema、Migrate、Client。
2.1 Prisma Schema:單一事實來源
Prisma Schema 是一個文字檔案(預設 prisma/schema.prisma),用一種類似 DSL 的語法來描述:
你用什麼資料庫(PostgreSQL、MySQL、SQLite 等);
如何連接這個資料庫;
你的業務模型(User、Post、Order 等)以及它們之間的關係;
要生成哪些程式碼(例如 TypeScript 客戶端)。
這個檔案就是「單一事實來源」(Single Source of Truth):你不需要手動去寫 SQL 來建立表結構,Schema 描述發生變化時,Prisma 工具鏈會幫你推演出對應的資料庫變更。
2.2 Prisma Client:自動生成的型別安全客戶端
Prisma Client 是 Prisma 根據 Schema 自動生成的一段 TypeScript/JS 程式碼,你把它當成「會說你資料庫語言的超級 DAO 就行」:
它知道有哪些表(model);
知道每個欄位的類型、是否可空、是否唯一;
知道有哪些關聯關係;
為你提供了型別安全的 CRUD API。
典型呼叫範例長這樣(這裡只是示意):
const user = await prisma.user.findUnique({
where: { id: 1 },
})
編輯器裡會自動提示 user 有哪些欄位,也會在你寫錯欄位名稱或類型時直接報錯。你不再需要在不同檔案之間來回跳轉確認「這個欄位叫 email 還是 emailAddress」。
2.3 Prisma Migrate:管理資料庫演進
Prisma Migrate 是 Prisma 提供的遷移系統,用於管理資料庫結構的演進過程。它做的事情包括:
讀取目前 Schema 和資料庫現狀;
推導出需要執行的 SQL 變更(比如加一欄、加索引);
以 migration 檔案的形式記錄下來;
提供在開發和生產中執行這些遷移的命令。
和「直接在資料庫裡點點點修改」相比,Migrate 的優勢在於:
所有結構變更都有可追溯的歷史;
團隊協作時,大家共享同一套遷移記錄;
在多環境(本地、測試、生產)中,結構更容易保持一致。
3. Prisma 支援哪些資料庫?
Prisma 目前主要支援關聯式資料庫以及部分文件資料庫,典型包括:
PostgreSQL(非常推薦,功能完備且與 Prisma 配合極佳);
MySQL / MariaDB;
SQLite(適合入門與簡單專案);
SQL Server;
以及 MongoDB(支援略有差異,Schema 寫法會有所不同)。
另外,你還會經常聽到「Prisma Postgres」這個詞,它是 Prisma 官方提供的一種託管 PostgreSQL 服務:無需自己部署資料庫,用幾步操作就能在雲端獲得一個與 Prisma 高度相容的 Postgres 實例,非常適合新專案或練習專案快速上手。
4. Prisma 的核心理念:型別安全與 DX(開發體驗)
從設計上看,Prisma 有兩個非常鮮明的理念:型別安全 和 開發體驗(DX)優先。
4.1 型別安全(Type-safe)
所謂型別安全,在 Prisma 的語境下主要體現在:
Schema 是強型別的;
Client 是根據 Schema 自動生成的;
你的 TS/JS 程式碼只要通過編譯,就能一定程度保證不會寫出「欄位名稱拼錯」、「欄位類型不對」這一類 bug。
這和「手寫 SQL + 手寫型別定義」的模式有很大不同:
你不需要維護重複的型別(SQL 一份、TS 一份);
修改模型時,只改 Schema,一鍵重新生成 Client;
編輯器的自動補全會非常強大。
4.2 DX 優先:命令列 + 視覺化 + IDE 整合
Prisma 提供了一整套圍繞開發體驗的工具:
CLI 命令:
prisma init初始化專案;prisma migrate dev進行開發環境遷移;prisma db push直接推送 Schema 到資料庫(適合原型階段);prisma generate生成 Client;prisma studio開啟 Web UI 瀏覽和編輯資料。Prisma Studio:
瀏覽表資料;
編輯/刪除記錄;
簡單除錯關聯關係。
VS Code 外掛:
Schema 檔案高亮;
自動補全;
語法錯誤提示。
這一整套下來,基本上你可以做到:在寫業務程式碼時,很少離開編輯器和命令列。
5. Prisma 在架構中的位置:它在系統裡扮演什麼角色?
從工程架構角度,可以這麼看 Prisma:
它是「資料庫存取層」的一部分;
位於你的業務邏輯層(Service/UseCase)和資料庫之間;
提供強型別的讀寫 API,隱藏底層 SQL。
簡單畫個邏輯上的「分層圖」(非嚴格層次,僅作心智模型):
Controller / API Route(HTTP 入口層)
接收請求、做權限驗證;
Service / UseCase(業務邏輯層)
組合各種業務規則;
呼叫資料存取層;
資料存取層(Repository + Prisma Client)
呼叫 Prisma Client 與資料庫互動;
資料庫(Postgres/MySQL/SQLite 等)。
你可以把 Prisma Client 看成「超級 Repository」,但在稍大一點的專案裡,通常還是會再包一層 Repository/DAO 來隔離 Prisma 的細節,便於未來替換或做單元測試。
下面是按同樣結構整理後的簡體中文版本(已規範表格與表達風格,保持與繁體/英文一致):
6. 和傳統 ORM 相比,Prisma 有哪些不同?
如果你用過 Sequelize、TypeORM 或 Java 生態中的 Hibernate,大概會關心:Prisma 和它們在本質上有什麼差異?
可以從幾個維度簡單對比:
維度 | 傳統 ORM(如 Sequelize / TypeORM) | Prisma |
|---|---|---|
模型定義方式 | 程式碼註解 / JS 物件 / class | 獨立的 Schema DSL 檔案 |
型別安全 | 依賴手動維護 TS 型別 | 由 Schema 自動生成 Client 型別 |
遷移管理 | 內建或外掛式遷移,偏腳本驅動 | Schema 驅動遷移,SQL 檔案清晰可追蹤 |
查詢 API 風格 | 類似 ActiveRecord 或 Query Builder | 函式式、鏈式、強型別的 |
多語言支援 | 通常只針對單一語言 | 專注於 JS / TS 生態 |
心智模型 | 「物件 ↔ 表」映射 | 「Schema 驅動的資料存取層」 |
你可以把 Prisma 理解為:
專為 JS / TS 打造的一個更現代、更型別安全的 ORM 2.0。
7. 面向生產環境的 Prisma:CI/CD 思路
前面講的內容在本地跑通就夠用了,但只要你打算進生產環境,就需要一套清晰的 CI/CD + 遷移治理 思路。
可以把「生產級 Prisma 用法」理解成這幾條原則:
開發環境用
migrate dev,生產環境只用migrate deploy開發:本地改
schema.prisma,執行npx prisma migrate dev,既生成遷移檔案,又順便更新本地資料庫,適合頻繁迭代。 github生產 / 測試:只跑
npx prisma migrate deploy,這個命令會讀取prisma/migrations目錄中尚未應用的遷移,一次性按順序執行,不會重設資料庫。官方文件明確不推薦在生產上跑
migrate dev或migrate reset,這兩個命令主要為開發場景設計。
把
migrate deploy放進 CI/CD,而不是手工在運維機上敲推薦做法是在 CI/CD Pipeline 裡新增一個「遷移步驟」,例如 GitHub Actions:
text- name: Run Prisma migrations run: npx prisma migrate deploy env: DATABASE_URL: ${{ secrets.DATABASE_URL }}這樣每次部署時,流水線會自動:拉取程式碼 → 安裝依賴 → 執行遷移 → 建置/發布應用,確保應用和資料庫結構始終同步。
官方文件也建議:生產/測試環境的遷移都透過自動化 pipeline 執行,而不是在開發者機器上直接連生產庫執行。
不同環境用不同的 DATABASE_URL,全部走環境變數/Secrets 管理
常見做法是 development / staging / production 各有一套獨立的資料庫 + 連線字串,透過 CI/CD 的環境變數或 Secrets 注入:
text# 本地開發 .env DATABASE_URL="postgresql://dev_user:dev_pwd@localhost:5432/dev_db" # CI / 生產,在平台上配置為環境變數,不寫進倉庫 DATABASE_URL="postgresql://prod_user:prod_pwd@prod-host:5432/prod_db"CI/CD 中的遷移和部署腳本只依賴環境變數,不在程式碼裡寫死連線資訊,這樣更安全也更易於運維。
遷移檔案進 Git,走正常 Code Review 流程
prisma migrate dev生成的prisma/migrations/*/migration.sql都應該一起提交到 Git,作為資料庫歷史的一部分。任何 Schema 變更(包括 AI 幫你生成的)都應該走正常的 PR + code review 流程,由人類審查遷移 SQL 是否安全(大表結構變更、非空欄位、資料遷移邏輯等)。
結合 Prisma Postgres 的 CI/CD 能力(可選)
如果你使用 Prisma Postgres,Prisma 在 6.13 之後提供了 Management API 和 GitHub Actions 模板,可以在 CI/CD 中自動:建立/刪除實例、為每個分支準備獨立資料庫、執行整合測試等。
這類自動化讓「每個 PR 有一套隔離環境」變得比較可行,對需要高品質預覽/回歸的團隊非常友好。
簡單來說:開發環境大膽用 migrate dev 快速迭代,生產環境嚴格用 migrate deploy + CI/CD 流水線控制節奏和安全,再配合良好的遷移審查習慣,就能把 Prisma 當成「生產級 ORM」來使用,而不是只停留在 Demo 階段。
8. 本篇小結
本篇你需要帶走的幾個關鍵點是:
Prisma 不只是一個 ORM,而是一整套「Schema 驅動的資料存取工具鏈」;
它的三大核心:Schema(描述)、Client(使用)、Migrate(演進);
它非常強調型別安全和開發體驗,和傳統 ORM 的風格有明顯不同;
我們之後的所有實踐,都是圍繞 schema.prisma 這個「單一事實來源」展開。
參考連結
Prisma官方文件
https://www.prisma.io/docs/orm/prisma-migrate/workflows/development-and-production
https://www.prisma.io/blog/orm-6-13-0-ci-cd-workflows-and-pgvector-for-prisma-postgres
https://www.prisma.io/docs/orm/prisma-migrate/workflows/development-and-production
https://www.prisma.io/blog/orm-6-13-0-ci-cd-workflows-and-pgvector-for-prisma-postgres
https://www.prisma.io/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5
Github
Dilukangelo
Cloudactivelabs
Mintlify
在 Google 上持續關注
把 HeyBinyang 加入 Google 首選來源
如果你希望之後在 Google 上更容易看到我的更新,可以把這個站點加入 preferred source,讓它在相關閱讀情境裡更容易被找到。
SHARE
分享
分享這篇文章。