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


95

有没有一种方法可以指定在执行sql脚本时,遇到脚本上的第一个错误时它将停止,无论先前的错误如何,该脚本通常都会继续。

Answers:


156

我认为向.psqlrc添加以下内容的解决方案远非完美

\set ON_ERROR_STOP on

存在更简单,方便的方法-将psql与参数一起使用:

psql -v ON_ERROR_STOP=1

最好同时使用-X参数来关闭.psqlrc文件的用法。非常适合我

ps在Peter Eisentraut的精彩文章中找到的解决方案。谢谢你,彼得! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html


8
-v ON_ERROR_STOP=ON至少也适用于9.2。我怀疑允许使用布尔值“ true”的任何变体
jpmc26 2014年

它在交互模式下不起作用,这让我有些困惑。
山姆·沃特金斯2015年

20

我认为您正在使用psql,这可能很方便添加到~/.psqlrc文件中。

\set ON_ERROR_STOP on

这将使其在第一个错误时中止。如果您没有它,即使进行事务处理,它也将继续执行您的脚本,但在脚本结束之前,所有操作都会失败。

您可能想要使用Paul所说的交易。psql --single-transaction ...如果您不想更改脚本,也可以这样做。

如此完整的示例,您的.psqlrc中带有ON_ERROR_STOP:

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

2
即使交易失败,psql的命令的退出状态仍为0
人人II博士

4
的确,即使--single-transaction使用-v ON_ERROR_STOP=1了非零状态, 它仍然是必要的
bitek 2015年

7

这并不是您想要的,但是如果您以开头begin transaction;并以结尾的脚本end transaction;,它将实际上跳过第一个错误之后的所有内容,然后回滚它在错误之前所做的所有操作。


没错,但是它仍然可以解析所有内容。而且,如果仅在第一个事务成功的情况下才想进行第二个事务,则此操作将无效。
通配符

是的,不要忘记遇到DDL时继续创建表错误...(版本:postrgres 10)。是的,它跳过一张桌子进入其他桌子……
JL Peyret

0

我一直喜欢直接参考手册。

PostgreSQL手册

退出状态

如果psql正常完成,它将返回0到shell;如果发生自身的致命错误(例如,内存不足,找不到文件),则返回1;如果与服务器的连接断开并且会话不是交互式的,则返回2;如果返回3,则返回3。脚本中发生错误,并设置了变量ON_ERROR_STOP。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.