跳到主要內容

故障排除

本指南介紹瞭如何在開發環境中解決Prisma Migrate的問題,這通常涉及到重置資料庫。關於生產環境的故障排除,請參閱

警告

本指南不適用於MongoDB
對於MongoDB,使用db push而不是migrate dev

處理遷移歷史衝突

檔案系統中的遷移資料夾資料庫中的_prisma_migrations之間存在差異時,就會發生遷移歷史衝突。

開發環境中遷移歷史衝突的原因

  • 已應用的遷移後來被修改
  • 已應用的遷移在檔案系統中缺失

在開發環境中,切換特性分支可能導致歷史衝突,因為_prisma_migrations表包含branch-1的遷移,而切換到branch-2可能導致其中一些遷移消失。

注意:你絕不應有意刪除或編輯已應用的遷移,因為這可能導致開發環境和生產環境之間的差異。

修復開發環境中的遷移歷史衝突

如果Prisma Migrate在你執行prisma migrate dev時檢測到遷移歷史衝突,CLI會要求重置資料庫並重新應用遷移歷史。

Schema漂移

資料庫schema漂移發生在你的資料庫schema與遷移歷史不同步時——資料庫schema已經“偏離”了真理之源。

開發環境中schema漂移的原因

Schema漂移可能發生在以下情況:

  • 資料庫schema在未使用遷移的情況下被更改——例如,透過使用prisma db push或手動更改資料庫schema。

注意:需要影子資料庫來檢測schema漂移,因此只能在開發環境中完成。

修復開發環境中的schema漂移

如果你對資料庫進行了不想保留的手動更改,或者可以在Prisma schema中輕鬆複製這些更改,則可以:

  1. 重置你的資料庫

    npx prisma migrate reset
  2. 在Prisma schema中複製更改並生成新的遷移

    npx prisma migrate dev

如果你對資料庫進行了要保留的手動更改,則可以:

  1. 內省資料庫

    npx prisma db pull

    Prisma將使用直接在資料庫中進行的更改來更新你的schema。

  2. 生成新的遷移以將內省的更改包含在你的遷移歷史中

    npx prisma migrate dev --name introspected_change

    Prisma Migrate將提示你重置,然後應用所有現有遷移和基於內省更改的新遷移。你的資料庫和遷移歷史現在已同步,包括你的手動更改。

失敗的遷移

開發環境中遷移失敗的原因

遷移可能失敗,如果:

  • 你在執行遷移之前修改了它並引入了語法錯誤
  • 你向已包含資料的表中添加了一個強制性(NOT NULL)列
  • 遷移過程意外停止
  • 資料庫在遷移過程中關閉

_prisma_migrations表中的每個遷移都有一個logs列,用於儲存錯誤。

修復開發環境中失敗的遷移

在開發環境中處理失敗遷移最簡單的方法是解決根本原因並重置資料庫。例如:

  • 如果你透過手動編輯資料庫引入了SQL語法錯誤,請更新失敗的migration.sql檔案並重置資料庫

    prisma migrate reset
  • 如果你在Prisma schema中引入了無法應用於已包含資料的資料庫的更改(例如,已包含資料的表中的強制列)

    1. 刪除migration.sql檔案。

    2. 修改schema——例如,為強制欄位新增預設值。

    3. 執行遷移

      prisma migrate dev

      Prisma Migrate將提示你重置資料庫並重新應用所有遷移。

  • 如果某些情況中斷了遷移過程,請重置資料庫

    prisma migrate reset

Prisma Migrate和PgBouncer

如果你嘗試在使用PgBouncer進行連線池的環境中執行Prisma Migrate命令,你可能會看到以下錯誤:

Error: undefined: Database error
Error querying the database: db error: ERROR: prepared statement "s0" already exists

請參閱Prisma Migrate和PgBouncer變通方法以獲取更多資訊和變通方法。

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