跳到主要內容

開發與生產

本頁說明如何在開發和生產環境中使用 Prisma Migrate 命令。

開發環境

在開發環境中,使用 migrate dev 命令來產生和套用遷移

npx prisma migrate dev

建立和套用遷移

危險

migrate dev 是一個開發命令,絕不應在生產環境中使用。

此命令會:

  1. 影子資料庫 中重新執行現有的遷移歷史記錄,以偵測 Schema 漂移(已編輯或刪除的遷移檔案,或對資料庫 Schema 的手動變更)
  2. 將待處理的遷移套用至影子資料庫(例如,同事建立的新遷移)
  3. 如果偵測到 Prisma Schema 的變更,它會從這些變更產生新的遷移
  4. 將所有未套用的遷移套用至開發資料庫,並更新 _prisma_migrations 表格
  5. 觸發 Artifact 的產生(例如,Prisma Client)

在以下情況下,migrate dev 命令會提示您重置資料庫

  • 修改或遺失的遷移 引起的遷移歷史記錄衝突
  • 資料庫 Schema 已從遷移歷史記錄的最終狀態漂移

重置開發資料庫

您也可以透過執行以下命令自行 reset 資料庫,以還原手動變更或 db push 實驗

npx prisma migrate reset
警告

migrate reset 是一個開發命令,絕不應在生產環境中使用。

此命令會:

  1. 如果可能,則刪除資料庫/Schema¹,或者在環境不允許刪除資料庫/Schema¹ 的情況下執行軟重置
  2. 如果資料庫/Schema¹ 已刪除,則建立一個具有相同名稱的新資料庫/Schema¹
  3. 套用所有遷移
  4. 執行種子腳本

¹ 對於 MySQL 和 MongoDB,這指的是資料庫;對於 PostgreSQL 和 SQL Server,指的是 Schema;對於 SQLite,指的是資料庫檔案。

注意:如需以簡單且整合的方式,根據需要經常重新建立開發資料庫中的資料,請查看我們的 植入種子資料指南

自訂遷移

有時,您需要在套用遷移之前修改它。例如:

  • 您想要引入重大的重構,例如將部落格文章標籤從 String[] 變更為 Tag[]
  • 您想要 重新命名欄位(預設情況下,Prisma Migrate 將會刪除現有的欄位)
  • 您想要 變更 1-1 關係的方向
  • 您想要新增 Prisma Schema Language 無法表示的功能 - 例如部分索引或預存程序。

--create-only 命令可讓您建立遷移,而無需套用它

npx prisma migrate dev --create-only

若要套用已編輯的遷移,請再次執行 prisma migrate dev

請參閱 自訂遷移 以取得範例。

團隊開發

請參閱:使用 Prisma Migrate 進行團隊開發

生產和測試環境

在生產和測試環境中,使用 migrate deploy 命令來套用遷移

npx prisma migrate deploy

注意migrate deploy 通常應為自動化 CI/CD 流程的一部分,我們不建議在本機執行此命令以將變更部署到生產資料庫。

此命令會:

  1. 比較已套用的遷移與遷移歷史記錄,如果任何遷移已修改,則會發出警告

    WARNING The following migrations have been modified since they were applied:
    20210313140442_favorite_colors
  2. 套用待處理的遷移

migrate deploy 命令:

  • 如果已套用的遷移從遷移歷史記錄中遺失,則不會發出警告
  • 不會偵測漂移(生產資料庫 Schema 與遷移歷史記錄的最終狀態不同 - 例如,由於 Hotfix)
  • 不會重置資料庫或產生 Artifact(例如 Prisma Client)
  • 依賴影子資料庫

另請參閱

諮詢鎖定

當您執行生產命令(例如)時,Prisma Migrate 會使用諮詢鎖定

  • prisma migrate deploy
  • prisma migrate dev
  • prisma migrate resolve

此安全措施可確保多個命令無法同時執行 - 例如,如果您快速連續合併兩個 Pull Request。

諮詢鎖定具有 10 秒逾時(不可設定),並使用基礎提供者中可用的預設諮詢鎖定機制

Prisma Migrate 的諮詢鎖定實作純粹是為了避免災難性錯誤 - 如果您的命令逾時,您將需要再次執行它。

5.3.0 起,可以使用 PRISMA_SCHEMA_DISABLE_ADVISORY_LOCK 環境變數 停用諮詢鎖定