技術6 閱讀

第 1 篇:Prisma 是什麼?

如果你寫過後端,一定遇到過下面這些問題:SQL 語句到處散落、欄位名稱和類型全靠記憶、重構表結構非常心驚膽跳。Prisma 想做的,就是給你一個強型別、現代化、可維護的資料存取層。

1. Prisma 到底是什麼

我們先用一句話概括:Prisma 是面向 TypeScript/JavaScript 的現代 ORM 和資料存取工具鏈,核心目標是:

傳統 ORM 會把「物件」和「表」一一映射,強調「像操作物件一樣操作資料庫」;Prisma 更像是在說:你用一種宣告式 DSL 描述你的「資料世界」,剩下的交給工具鏈來保證安全與一致性。

Prisma 當前主要支援的執行環境包括:

2. Prisma 的三大核心元件

理解 Prisma 最重要的,是把握住它的三個核心角色:Schema、Migrate、Client。

2.1 Prisma Schema:單一事實來源

Prisma Schema 是一個文字檔案(預設 prisma/schema.prisma),用一種類似 DSL 的語法來描述:

這個檔案就是「單一事實來源」(Single Source of Truth):你不需要手動去寫 SQL 來建立表結構,Schema 描述發生變化時,Prisma 工具鏈會幫你推演出對應的資料庫變更。

2.2 Prisma Client:自動生成的型別安全客戶端

Prisma Client 是 Prisma 根據 Schema 自動生成的一段 TypeScript/JS 程式碼,你把它當成「會說你資料庫語言的超級 DAO 就行」:

典型呼叫範例長這樣(這裡只是示意):

text
const user = await prisma.user.findUnique({
  where: { id: 1 },
})

編輯器裡會自動提示 user 有哪些欄位,也會在你寫錯欄位名稱或類型時直接報錯。你不再需要在不同檔案之間來回跳轉確認「這個欄位叫 email 還是 emailAddress」。

2.3 Prisma Migrate:管理資料庫演進

Prisma Migrate 是 Prisma 提供的遷移系統,用於管理資料庫結構的演進過程。它做的事情包括:

和「直接在資料庫裡點點點修改」相比,Migrate 的優勢在於:

3. Prisma 支援哪些資料庫?

Prisma 目前主要支援關聯式資料庫以及部分文件資料庫,典型包括:

另外,你還會經常聽到「Prisma Postgres」這個詞,它是 Prisma 官方提供的一種託管 PostgreSQL 服務:無需自己部署資料庫,用幾步操作就能在雲端獲得一個與 Prisma 高度相容的 Postgres 實例,非常適合新專案或練習專案快速上手。

4. Prisma 的核心理念:型別安全與 DX(開發體驗)

從設計上看,Prisma 有兩個非常鮮明的理念:型別安全開發體驗(DX)優先

4.1 型別安全(Type-safe)

所謂型別安全,在 Prisma 的語境下主要體現在:

這和「手寫 SQL + 手寫型別定義」的模式有很大不同:

4.2 DX 優先:命令列 + 視覺化 + IDE 整合

Prisma 提供了一整套圍繞開發體驗的工具:

這一整套下來,基本上你可以做到:在寫業務程式碼時,很少離開編輯器和命令列。

5. Prisma 在架構中的位置:它在系統裡扮演什麼角色?

從工程架構角度,可以這麼看 Prisma:

簡單畫個邏輯上的「分層圖」(非嚴格層次,僅作心智模型):

你可以把 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

函式式、鏈式、強型別的 where / include

多語言支援

通常只針對單一語言

專注於 JS / TS 生態

心智模型

「物件 ↔ 表」映射

「Schema 驅動的資料存取層」

你可以把 Prisma 理解為:

專為 JS / TS 打造的一個更現代、更型別安全的 ORM 2.0。


7. 面向生產環境的 Prisma:CI/CD 思路

前面講的內容在本地跑通就夠用了,但只要你打算進生產環境,就需要一套清晰的 CI/CD + 遷移治理 思路。

可以把「生產級 Prisma 用法」理解成這幾條原則:

  1. 開發環境用 migrate dev,生產環境只用 migrate deploy

    • 開發:本地改 schema.prisma,執行 npx prisma migrate dev,既生成遷移檔案,又順便更新本地資料庫,適合頻繁迭代。 github

    • 生產 / 測試:只跑 npx prisma migrate deploy,這個命令會讀取 prisma/migrations 目錄中尚未應用的遷移,一次性按順序執行,不會重設資料庫

    • 官方文件明確不推薦在生產上跑 migrate devmigrate reset,這兩個命令主要為開發場景設計。

  2. 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 執行,而不是在開發者機器上直接連生產庫執行。

  3. 不同環境用不同的 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 中的遷移和部署腳本只依賴環境變數,不在程式碼裡寫死連線資訊,這樣更安全也更易於運維。

  4. 遷移檔案進 Git,走正常 Code Review 流程

    • prisma migrate dev 生成的 prisma/migrations/*/migration.sql 都應該一起提交到 Git,作為資料庫歷史的一部分。

    • 任何 Schema 變更(包括 AI 幫你生成的)都應該走正常的 PR + code review 流程,由人類審查遷移 SQL 是否安全(大表結構變更、非空欄位、資料遷移邏輯等)。

  5. 結合 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官方文件

  1. https://www.prisma.io/docs/orm/prisma-migrate/workflows/development-and-production

  2. https://www.prisma.io/blog/orm-6-13-0-ci-cd-workflows-and-pgvector-for-prisma-postgres

  3. https://www.prisma.io/docs/cli/migrate/deploy

  4. https://www.prisma.io/docs/orm/prisma-migrate/workflows/development-and-production

  5. https://www.prisma.io/blog/orm-6-13-0-ci-cd-workflows-and-pgvector-for-prisma-postgres

  6. https://www.prisma.io/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5

Github

  1. https://github.com/prisma/prisma/discussions/24571

Dilukangelo

  1. https://dilukangelo.dev/mastering-prisma-orm-a-practical-guide-to-deployment-and-cicd

Cloudactivelabs

  1. https://cloudactivelabs.com/en/blog/prisma-migrations-for-production-best-practices-and-tips

Mintlify

  1. https://www.mintlify.com/prisma/prisma/migrate/migration-workflows

SHARE

分享

分享這篇文章。