Postgres sql在脚本错误时失败

Ray*_*Ray 91 postgresql

有没有办法指定在执行sql脚本时它在遇到脚本上的第一个错误时停止,它通常会继续,而不管以前的错误.

谢谢

Alf*_*she 146

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

\set ON_ERROR_STOP on
Run Code Online (Sandbox Code Playgroud)

存在更简单方便的方法 - 使用带参数的psql:

psql -v ON_ERROR_STOP=1
Run Code Online (Sandbox Code Playgroud)

最好还使用-X参数关闭.psqlrc文件用法.适合我

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

  • `-v ON_ERROR_STOP = ON`也有效,至少9.2.我怀疑允许任何[boolean"true"的变体](http://www.postgresql.org/docs/9.2/static/datatype-boolean.html). (7认同)
  • 它在交互模式下不起作用,这让我困惑了一分钟。 (2认同)

plu*_*dra 14

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

\set ON_ERROR_STOP on
Run Code Online (Sandbox Code Playgroud)

这将使其在第一个错误中止.如果你没有它,即使有一个事务,它将继续执行你的脚本但是在脚本结束之前一切都失败了.

保罗说,你可能想要使用交易.psql --single-transaction ...如果您不想更改脚本,也可以使用哪种方法.

这是一个完整的例子,你的.psqlrc中有ON_ERROR_STOP:

psql --single-transaction --file /your/script.sql
Run Code Online (Sandbox Code Playgroud)

  • 实际上,即使使用`--single-transaction`,对于非零存在状态仍然需要`-v ON_ERROR_STOP = 1` (4认同)
  • 即使事务失败,psql命令的退出状态仍为0. (2认同)

Pau*_*lin 6

这不完全是你想要的,但是如果你用脚本开始begin transaction;并结束end transaction;,它实际上会跳过第一个错误之后的所有内容,然后它会回滚它在错误之前所做的一切.