故障排除
本指南介紹瞭如何在開發環境中解決Prisma Migrate的問題,這通常涉及到重置資料庫。關於生產環境的故障排除,請參閱
處理遷移歷史衝突
當檔案系統中的遷移資料夾與資料庫中的_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中輕鬆複製這些更改,則可以:
-
重置你的資料庫
npx prisma migrate reset -
在Prisma schema中複製更改並生成新的遷移
npx prisma migrate dev
如果你對資料庫進行了要保留的手動更改,則可以:
-
內省資料庫
npx prisma db pullPrisma將使用直接在資料庫中進行的更改來更新你的schema。
-
生成新的遷移以將內省的更改包含在你的遷移歷史中
npx prisma migrate dev --name introspected_changePrisma Migrate將提示你重置,然後應用所有現有遷移和基於內省更改的新遷移。你的資料庫和遷移歷史現在已同步,包括你的手動更改。
失敗的遷移
開發環境中遷移失敗的原因
遷移可能失敗,如果:
- 你在執行遷移之前修改了它並引入了語法錯誤
- 你向已包含資料的表中添加了一個強制性(
NOT NULL)列 - 遷移過程意外停止
- 資料庫在遷移過程中關閉
_prisma_migrations表中的每個遷移都有一個logs列,用於儲存錯誤。
修復開發環境中失敗的遷移
在開發環境中處理失敗遷移最簡單的方法是解決根本原因並重置資料庫。例如:
-
如果你透過手動編輯資料庫引入了SQL語法錯誤,請更新失敗的
migration.sql檔案並重置資料庫prisma migrate reset -
如果你在Prisma schema中引入了無法應用於已包含資料的資料庫的更改(例如,已包含資料的表中的強制列)
-
刪除
migration.sql檔案。 -
修改schema——例如,為強制欄位新增預設值。
-
執行遷移
prisma migrate devPrisma 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變通方法以獲取更多資訊和變通方法。