psqlでエラーが出てもステータスコードが0になるパターン

psqlコマンドでSQLファイルから標準入力で受け取って実行するには以下のようにする。

$ psql -U usename -d dbname < test.sql

上記でtest.sqlの内容を受け取ってSQLを実行する。

このSQLファイルの中のSQLを実行してエラーが出てもステータスコードは0になる。

$ cat test
select * from

$ psql -U usename -d dbname < test.sql
ERROR:  syntax error at end of input
LINE 1: select * from

$ echo $?
0

test.sqlの中身はselect * fromで止まっており、SQLの文法エラーとなっている。
このSQLを実行するとエラーとなるが終了ステータスコードは0になっている。

例えばシェルスクリプトの-eオプションでエラーが出たら終了するようにしている場合でもpsqlコマンドで止まってくれない。

#!/bin/bash

set -e
psql -U usename -d dbname < test.sql

echo "finished"

上記はpsqlコマンドが成功すればfinishedが出力される、という予定で記述している。
しかし、psqlコマンドはエラーが出ても終了ステータスコードが0になるのでfinishedが出力されてしまう。

$ ./test.sh
ERROR:  syntax error at end of input
LINE 1: select * from
finished

0以外の終了ステータスコードにする方法

上記のようにエラーとなるSQLファイルを受け取った場合に終了ステータスコードを0以外にするには-v ON_ERROR_STOP=1オプションをつける。

$ psql  -v ON_ERROR_STOP=1 -U usename -d dbname < test.sql
ERROR:  syntax error at end of input
LINE 1: select * from

$ echo $?
3

シェルスクリプトで-eオプションを使った場合もエラーがあった場所で止まるようになる。

#!/bin/bash

set -e
psql -v ON_ERROR_STOP=1 -U usename -d dbname < test.sql

echo "finished"

実行するとエラーがあった場所で止まり、finishedは出力されない。

$ ./test.sh
ERROR:  syntax error at end of input
LINE 1: select * from

-cオプションでSQLを実行する場合は0以外の終了ステータスコードになる

-cオプションを使うとSQLを直接指定して実行できる。

$ psql -U usename -d dbname -c "select * from users"

この場合はSQLの文法エラーがあった場合でも終了ステータスコードは0以外になる。
例えばselect * fromだけのSQLを実行するとステータスコードは0以外の値で終了する。

$ psql -U usename -d dbname -c "select * from"
ERROR:  syntax error at end of input
LINE 1: select * from

$ echo $?
1

この場合は-v ON_ERROR_STOP=1オプションをつける必要はない。

シェルスクリプトでも同様。

#!/bin/bash

set -e
psql -U usename -d dbname -c "select * from"

echo "finished"

実行するとエラーがあった場所で止まり、finishedは出力されない。

$ ./test.sh
ERROR:  syntax error at end of input
LINE 1: select * from