⛳
本番環境で`prisma migrate deploy`実行後のエラーから回復
prisma migrate deploy
実行後のエラーから回復
本番環境で-
バックグラウンド
- 本番環境で
npx prisma migrate deploy
を実行して、次のようなエラーが出るERROR: column "XXX" of relation "XXX" contains null values
ERROR: insert or update on table "XXX" violates foreign key constraint "XXX"
- 原因
- DBテーブルにデータが存在してるので、そのままnullが許せないテーブルのColumnの追加とか、そもそもforeign keyが存在しないColumnの追加ができない。
- 開発環境である場合は、一部のDBテーブルのデータを削除してから、テーブルの更新ができます。本番環境の場合は、データの無駄の削除ができない。
- でもデータが存在する状態でテーブルの修正ができない
- 本番環境で
-
解決方法:
- コンフリクトが存在するテーブルに対して、テーブルのデータだけに対してDB dumpを作る (例: "user"テーブル )
pg_dump --column-inserts --data-only -U your_user -h your_host -p 5432 --table public."user" your_DB_name > your_dump_file.sql
- コンフリクトが存在するテーブルにデータの削除を行う
delete from "コンフリクトが存在するテーブル";
- 前回の
prisma migrate deploy
の失敗から回復- https://www.prisma.io/docs/orm/prisma-migrate/workflows/patching-and-hotfixing#failed-migration
- Postgres DBにアクセスして、
select migration_name from _prisma_migrations order by started_at desc;
を実行して、最近失敗のmigrationを探す - 以下のことを実行して、前回のコンフリクトが解決したことをPrisma側に伝える
npx prisma migrate resolve --rolled-back "前回失敗したmigration" npx prisma migrate deploy
- 元のDBデータの回復
- 手動で前生成されるDB dumpファイルを(your_dump_file.sql)修正して、null values、foreign key違反などのDB insertにならないようにする
- 以下のコマンドで、DBデータの回復
psql -U your_user -h your_host -d your_DB_name -W -f your_dump_file.sql
- コンフリクトが存在するテーブルに対して、テーブルのデータだけに対してDB dumpを作る (例: "user"テーブル )
Discussion