跳到主要內容

心智模型

本指南提供了在使用關係型資料庫時,關於 Prisma Migrate 資料庫遷移的概念性概述。它涵蓋了:資料庫遷移是什麼、它們的價值,以及 Prisma Migrate 是什麼以及如何在不同環境中透過 Prisma Migrate 演進您的資料庫 Schema。

如果您正在使用 MongoDB,請使用 prisma db push 來演進您的 Schema。

什麼是資料庫遷移?

資料庫遷移是一組受控的更改,用於修改和演進資料庫 Schema 的結構。遷移幫助您將資料庫 Schema 從一種狀態轉換到另一種狀態。例如,在遷移中,您可以建立或刪除表和列,拆分表中的欄位,或者為資料庫新增型別和約束。

演進資料庫 Schema 的模式

本節描述了演進資料庫 Schema 的通用 Schema 遷移模式。

兩種主要的 Schema 遷移模式是

  • 模型/實體優先遷移:透過這種模式,您用程式碼定義資料庫 Schema 的結構,然後使用遷移工具生成 SQL,例如,用於同步您的應用程式和資料庫 Schema。

Model-first migration flow

  • 資料庫優先遷移:透過這種模式,您定義資料庫的結構並使用 SQL 將其應用於資料庫。然後您會內省資料庫以生成描述資料庫結構的程式碼,從而同步您的應用程式和資料庫 Schema。

Database-first migration flow

資訊

注意

為簡單起見,我們選擇了上述術語來描述演進資料庫 Schema 的不同模式。其他工具和庫可能使用不同的術語來描述這些不同的模式。

遷移檔案 (SQL) 理想情況下應與您的應用程式程式碼一起儲存。它們還應在版本控制中進行跟蹤,並與團隊中其他從事該應用程式工作的人員共享。

遷移提供了狀態管理,幫助您跟蹤資料庫的狀態。

遷移還允許您在特定時間點複製資料庫的狀態,這在與團隊其他成員協作時非常有用,例如在不同分支之間切換時。

有關資料庫遷移的更多資訊,請參閱 Prisma 資料指南

什麼是 Prisma Migrate?

Prisma Migrate 是一款資料庫遷移工具,支援模型/實體優先的遷移模式,用於管理本地環境和生產環境中的資料庫 Schema。

在您的專案中使用 Prisma Migrate 的工作流程將是迭代的,如下所示

本地開發環境(特性分支)

  1. 演進您的 Prisma Schema
  2. 使用 prisma migrate devprisma db push 將您的 Prisma Schema 與本地開發資料庫的資料庫 Schema 同步

預覽/暫存環境(特性拉取請求)

  1. 將您的更改推送到特性拉取請求
  2. 使用 CI 系統(例如 GitHub Actions)透過 prisma migrate deploy 將您的 Prisma Schema 和遷移歷史與您的預覽資料庫同步

生產環境(主分支)

  1. 將您的應用程式程式碼從特性分支合併到主分支
  2. 使用 CI 系統(例如 GitHub Actions)透過 prisma migrate deploy 將您的 Prisma Schema 和遷移歷史與您的生產資料庫同步

Prisma Migrate workflow

Prisma Migrate 如何跟蹤遷移狀態

Prisma Migrate 使用以下狀態要素來跟蹤資料庫 Schema 的狀態

  • Prisma Schema:您的真相來源,定義了資料庫 Schema 的結構。
  • 遷移歷史:您 prisma/migrations 資料夾中的 SQL 檔案,代表了對資料庫 Schema 所做更改的歷史記錄。
  • 遷移表:資料庫中的 prisma_migrations 表,用於儲存已應用於資料庫的遷移的元資料。
  • 資料庫 Schema:資料庫的狀態。

Prisma Migrate "state management"

使用 Prisma Migrate 時的要求

  • 理想情況下,您應該為每個環境使用一個數據庫。例如,您可能為開發、預覽和生產環境分別設定一個獨立的資料庫。
  • 您在開發環境中使用的資料庫是一次性的——您可以根據需要輕鬆建立、使用和刪除資料庫。
  • 每個環境中使用的資料庫配置應保持一致。這對於確保某個遷移在整個工作流程中都能對資料庫產生相同的更改非常重要。
  • Prisma Schema 是您的真相來源——描述了您的資料庫 Schema 的形態。

使用 Prisma Migrate 演進您的資料庫 Schema

本節描述瞭如何使用 Prisma Migrate 在不同環境(開發、暫存和生產)中演進您的資料庫 Schema。

開發環境中的 Prisma Migrate(本地)

使用 prisma migrate dev 跟蹤您的遷移歷史

prisma migrate dev 命令允許您跟蹤對資料庫所做的更改。prisma migrate dev 命令會自動生成 SQL 遷移檔案(儲存在 /prisma/migrations 中)並將其應用於資料庫。當遷移應用於資料庫時,資料庫中的遷移表(_prisma_migrations)也會更新。

Prisma Migrate dev flow

prisma migrate dev 命令使用以下狀態要素跟蹤資料庫的狀態

  • Prisma Schema
  • 遷移歷史
  • 遷移表
  • 資料庫 Schema

注意:用於跟蹤遷移狀態的狀態要素與Prisma Migrate 如何跟蹤遷移狀態一節中描述的相同。

您可以使用 --create-only 標誌在將遷移應用於資料庫之前對其進行自定義。例如,如果您想在不造成任何資料丟失的情況下重新命名列,或者載入資料庫擴充套件(在 PostgreSQL 中)和資料庫檢視(目前不支援),您可能需要編輯遷移。

在底層,Prisma Migrate 使用影子資料庫來檢測Schema 漂移並生成新的遷移。

注意prisma migrate dev 僅適用於使用一次性資料庫的開發環境。

如果 prisma migrate dev 檢測到 Schema 漂移或遷移歷史衝突,系統將提示您重置(刪除並重新建立您的資料庫)您的資料庫,以同步遷移歷史和資料庫 Schema。

展開檢視卡通圖解釋的影子資料庫

A cartoon that shows how the shadow database works.

解決 Schema 漂移

Schema 漂移發生在預期資料庫 Schema 與遷移歷史中的內容不同時。例如,當您手動更新資料庫 Schema 而沒有相應地更新 Prisma Schema 和 prisma/migrations 時,就可能發生這種情況。

對於此類情況,您可以使用 prisma migrate diff 命令來比較您的遷移歷史並回滾對資料庫 Schema 所做的更改。

Revert database schema with migrate diff

您可以使用 migrate diff 生成 SQL,它要麼

  • 回滾資料庫 Schema 中所做的更改,使其與當前的 Prisma Schema 同步
  • 將您的資料庫 Schema 向前推進,以應用 Prisma Schema 和 /migrations 中缺失的更改

然後,您可以使用 prisma db execute 命令將更改應用於您的資料庫。

原型化您的 Schema

prisma db push 命令允許您同步您的 Prisma Schema 和資料庫 Schema,而無需持久化遷移(/prisma/migrations)。prisma db push 命令使用以下狀態要素跟蹤資料庫的狀態

  • Prisma Schema
  • 資料庫 Schema

prisma db push development flow

prisma db push 命令在以下情況中很有用

  • 您希望在本地快速原型化和迭代 Schema 設計,而無需將這些更改部署到其他環境,例如其他開發人員或暫存和生產環境。
  • 您優先考慮達到期望的最終狀態,而不是實現該最終狀態所執行的更改或步驟(無法預覽 prisma db push 所做的更改)
  • 您不需要控制 Schema 更改如何影響資料。無法編排 Schema 和資料遷移——如果 prisma db push 預期更改將導致資料丟失,您可以選擇使用 --accept-data-loss 選項接受資料丟失或停止該過程——無法自定義更改。

如果 prisma db push 命令檢測到對資料庫 Schema 的破壞性更改,它將提示您重置資料庫。例如,當您向一個已存在內容的表新增必需欄位但未提供預設值時,就會發生這種情況。

當您的資料庫 Schema 與遷移歷史和遷移表不同步時,就會發生Schema 漂移

暫存和生產環境中的 Prisma Migrate

同步您的遷移歷史

prisma migrate deploy 命令允許您將開發環境中的遷移歷史與暫存或生產環境中的資料庫同步。

在底層,migrate deploy 命令

  1. 比較已應用的遷移(捕獲的 _prisma_migrations)和遷移歷史(/prisma/migrations
  2. 應用待處理的遷移
  3. 使用新遷移更新 _prisma_migrations

Workflow of Prisma Migrate

該命令應在自動化 CI/CD 環境中執行,例如 GitHub Actions。

如果您沒有遷移歷史(/migrations),即正在使用 prisma db push,那麼您將不得不繼續在暫存和生產環境中使用 prisma db push。請注意應用於資料庫 Schema 的更改,因為其中一些可能具有破壞性。例如,prisma db push 無法判斷您何時正在執行列重新命名。它將提示進行資料庫重置(刪除並重新建立)。

© . This site is unofficial and not affiliated with Prisma Data, Inc.