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
\第一線のプログラマーの行動原理を学べる!/