当 Postgres 脚本遇到错误时,我如何停止它?

有没有一种方法可以指定,在执行 sql 脚本时,当遇到脚本上的第一个错误时,它通常会停止,而不管以前的错误如何。

61835 次浏览

这并不完全是您想要的,但是如果您以 begin transaction;开始脚本并以 end transaction;结束脚本,那么它实际上将跳过第一个错误之后的所有内容,然后它将回滚在发生错误之前执行的所有操作。

我假设您正在使用 psql,这可能会方便地添加到您的 ~/.psqlrc文件。

\set ON_ERROR_STOP on

这将使它在第一个错误时中止。如果您没有它,即使有一个事务,它也会继续执行您的脚本,但是一切都会失败,直到您的脚本结束。

正如保罗所说,你可能想使用交易。如果不想修改脚本,也可以使用 psql --single-transaction ...来完成。

这是一个完整的例子,在. psqlrc 中包含 ON _ ERROR _ STOP:

psql --single-transaction --file /your/script.sql

我认为在.psqlrc 中添加以下内容的解决方案远远不够完美

\set ON_ERROR_STOP on

还有一种更简单方便的方法——使用带参数的 psql:

psql -v ON_ERROR_STOP=1

最好还使用 -X参数关闭.psqlrc 文件的用法。 对我来说再合适不过了

附注: 解决方案发现在伟大的邮件从彼得艾森特劳特。谢谢你,彼得! Http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html

我总是喜欢直接参考手册。

来自 PostgreSQL 手册:

退出状态

如果正常结束,psql 将返回0到 shell,如果是致命的,返回1 出现自己的错误(例如,内存不足,找不到文件) ,2如果 与服务器的连接出现问题,会话不是交互式的, 如果脚本和变量中发生错误,则为3 已设置 ON _ ERROR _ STOP。

默认情况下,如果在 PostgreSQL 服务器错误 psql 上运行的 sql 代码不会退出错误。它将捕获错误并继续。如果像上面提到的那样,将 ON_ERROR_STOP设置为 on,当 psql 捕获 sql 代码中的错误时,它将退出并将 3返回到 shell。