在Unix shell脚本中检查psql命令的返回状态

38

我正在使用psql命令连接和查询PostgreSQL数据库。请问有人知道如何在shell脚本中检查执行查询后的返回状态吗?

我已经使用了echo $? 命令来检查状态,但它总是返回零。

谢谢帮助。

2个回答

76

psql的返回代码已有文档记录:

退出状态
如果psql正常结束,则向shell返回0;如果发生其自己的致命错误(例如内存不足,找不到文件),则返回1;如果与服务器的连接出现问题且会话不是交互式的,则返回2;如果脚本中发生了错误并设置了变量ON_ERROR_STOP,则返回3。

您可能只需要使用ON_ERROR_STOP。

在测试和报告时出现了故障:

$ psql -d test -v "ON_ERROR_STOP=1" <<EOF
select error;
select 'OK';
EOF

ERROR:  column "error" does not exist
LINE 1: select error;

$ echo $?
3

操作失败被忽略且未报告给shell:

$ psql -d test  <<EOF
select error;
select 'OK';
EOF
ERROR:  column "error" does not exist
LINE 1: select error;
               ^
 ?column? 
----------
 OK
(1 row)

$ echo $?
0

这似乎不是由于权限错误触发的。我有一个命令以状态0退出。 - raphael
@raphael:可能是个bug,你有测试用例可以分享吗? - Daniel Vérité
非超级用户能否访问系统表? - raphael
@raphael: pg_catalog.pg_authid @raphael:pg_catalog.pg_authid - Daniel Vérité
啊……我想问题出在我在两个命令之间使用了管道,而第一个命令失败了。psql -v "ON_ERROR_STOP=1" -c "\COPY pg_catalog.pg_authid TO STDOUT;" | cat 产生了 ERROR: permission denied for relation pg_authid 的错误,但是退出代码为0。以后会使用这个方法 https://dev59.com/1nM_5IYBdhLWcg3wzmgw - raphael
1
@raphael:在Bash中查看set -o pipefail以在错误时使管道失败。 - Victor Roetman

6

此处所述,您还可以在SQL文件/脚本的顶部添加以下行:

\set ON_ERROR_STOP true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接