本番環境で`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の失敗から回復
      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
Bizlink Developers Blog

Discussion