PostgreSQLで大きめのSQLファイルを一気に流し込む時、単に psql -f で実行するとどこで失敗したのかが分からなかったり、途中で止まらずに延々とエラーを吐き続けてしまうことがあります。正常に終わったと思ったら正常でなかったなんてこともあります。流し込むSQLが大きく実行に時間がかかるとげんなりします。そういった事態の対策に便利なのがオプションの -e と -v ON_ERROR_STOP=1 です。
実行例は次です。
docker compose exec -T db \ # Docker上のPostgreSQLを持つコンテナに psql -U postgres -d tgtdb \ # postgres ユーザーで tgtdb に大して -e -v ON_ERROR_STOP=1 \ # -e -v ON_ERROR_STOP=1 付きで -f ./tmp/tgtdb.sql # ./tmp/tgtdb.sql を流し込む
このようにすると -e によって実行中のSQLが標準出力にエコーされ、どのSQLでエラーが起きたのかが明確になります。加えて ON_ERROR_STOP=1 によって1つでもエラーが発生した時点で処理が止まります。
こうすると完璧に正常に実行完了しなかったことが即座に分かり、エラー原因の調査もやりやすいです。
こんな感じですぐやり直せると、とりあえず実行して失敗したら直してもう一回実行して…という作業サイクルを回しやすいです。データベース移行などの単にSQLをそのまま実行すると失敗が予想されるような作業時には特に便利です。