跳到主要內容

壓縮遷移

本指南說明如何將多個遷移檔案壓縮成單個遷移。

關於壓縮遷移

有時將部分或所有遷移檔案壓縮成單個遷移會很有用。本指南將說明您可能想要這樣做的兩種情境

在這兩種情況下,Prisma Migrate 都提供了執行此操作的工具,方法是使用 migrate diff 命令來比較兩個資料庫 schema 並輸出一個單個 SQL 檔案,讓您從一個 schema 轉換到另一個 schema。本指南的其餘部分將詳細說明如何在這兩種情境中執行此操作。

從開發環境乾淨地遷移

當使用基於分支的工作流程進行開發時,壓縮遷移可能很有用。在功能分支上進行大型本機開發工作期間,您可能會使用 migrate dev 產生多個遷移。功能完成後,遷移歷史記錄可能包含不必要的中間步驟,這些步驟在最終將推送到 main 分支的遷移歷史記錄中是不需要的。

可能存在避免在生產環境中應用中間步驟的重要原因 — 它們可能會遺失資料或非常緩慢/破壞性。即使情況並非如此,您也可能希望避免生產環境的遷移歷史記錄中出現混亂。

有關如何使用 migrate dev 達成此目的的詳細步驟,請參閱關於 如何從開發環境乾淨地遷移 的章節。

在生產環境中建立乾淨的歷史記錄

壓縮遷移也可用於生產環境中,將所有遷移檔案壓縮成一個。當生產環境累積了較長的遷移歷史記錄,並且在新環境中重播它因中間步驟需要額外時間而變得繁瑣時,這可能會很有用。由於團隊沒有從遷移步驟中獲得價值(並且可以在緊急情況下從版本控制歷史記錄中恢復它們),因此決定將整個歷史記錄壓縮成單個遷移。

有關如何使用 migrate diffmigrate resolve 達成此目的的詳細步驟,請參閱關於 如何在生產環境中建立乾淨的歷史記錄 的章節。

壓縮遷移時的考量

警告

當壓縮遷移時,請注意,您在 migration.sql 檔案中手動變更或新增的任何 SQL 都將不會被保留。如果您有包含自訂新增內容(例如視圖或觸發器)的遷移檔案,請確保在遷移壓縮後重新新增它們。

如何壓縮遷移

本節提供關於如何在上述兩種情境中壓縮遷移的逐步說明

如何從開發環境乾淨地遷移

在壓縮遷移之前,請確保您具有以下起始條件

  • 要壓縮的遷移內容尚未應用於生產資料庫
  • 已應用於生產環境的所有遷移都已是本機遷移歷史記錄的一部分
  • 您已新增到分支的任何新遷移檔案中都沒有自訂 SQL
資訊

如果生產資料庫上的遷移歷史記錄在您建立功能分支後發生分歧,那麼您需要先將生產環境的遷移歷史記錄和資料模型變更合併到您的本機歷史記錄中。

然後按照這些步驟操作

  1. 將本機 ./prisma/migrations 資料夾的內容重設為與 main 分支上的遷移歷史記錄相符

  2. 建立新的遷移

    npx prisma migrate dev --name squashed_migrations

    這會建立一個單個遷移,將您從

    • 重設遷移歷史記錄中所述的 main 分支狀態
    • 到您的本機功能狀態,如您的 ./prisma/schema.prisma 檔案中所述
    • 並將其輸出到以 squashed_migrations 結尾的新目錄中的新 migration.sql 檔案(使用 --name 標誌指定)

現在可以使用 migrate deploy 將這個單個遷移檔案應用於生產環境。

如何在生產環境中建立乾淨的歷史記錄

在壓縮遷移之前,請確保您具有以下起始條件

  • 遷移歷史記錄中的所有遷移都已應用於生產資料庫
  • 資料模型與遷移歷史記錄相符
  • 資料模型和遷移歷史記錄已同步

然後按照這些步驟操作,可以在您的 main 分支上或在一個新簽出的分支上進行,該分支在其他任何變更之前合併回 main

  1. 刪除 ./prisma/migrations 目錄的所有內容

  2. ./prisma/migrations 目錄中建立一個新的空目錄。在本指南中,這將被稱為 000000000000_squashed_migrations。在此目錄中,新增一個新的空 migration.sql 檔案。

    資訊

    我們將遷移命名為 000000000000_squashed_migrations 並帶有所有前導零,因為我們希望它成為遷移目錄中的第一個遷移。Migrate 按照詞彙(字母)順序執行目錄中的遷移。這就是為什麼當您使用 migrate dev 時,它會產生以日期和時間為前綴的遷移。您可以為遷移指定另一個名稱,只要它排序低於後來的遷移即可,例如 0_squashed202207180000_squashed

  3. 建立一個單個遷移,將您從

    • 空的資料庫
    • 到您的 ./prisma/schema.prisma 檔案中所述的生產資料庫 schema 的目前狀態
    • 並將其輸出到上面建立的 migration.sql 檔案中

    您可以使用 migrate diff 命令執行此操作。從專案的根目錄,執行以下命令

    npx prisma migrate diff \
    --from-empty \
    --to-schema-datamodel ./prisma/schema.prisma \
    --script > ./prisma/migrations/000000000000_squashed_migrations/migration.sql
  4. 將此遷移標記為已在生產環境中應用,以防止它在那裡執行

    您可以使用 migrate resolve 命令將 000000000000_squashed_migrations 目錄中的遷移標記為已應用

    npx prisma migrate resolve \
    --applied 000000000000_squashed_migrations

您現在應該有一個單個遷移檔案,該檔案被標記為已在生產環境中應用。新的簽出只會獲得一個單個遷移,將它們帶到生產資料庫 schema 的狀態。

生產資料庫仍然在遷移表中包含已應用遷移的歷史記錄。遷移資料夾和資料模型的歷史記錄也仍然在原始碼控制中可用。