【问题标题】:How can I stop a Postgres script when it encounters an error?遇到错误时如何停止 Postgres 脚本?
【发布时间】:2011-05-27 16:39:11
【问题描述】:

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

【问题讨论】:

    标签: postgresql error-handling psql


    【解决方案1】:

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

    \set ON_ERROR_STOP on
    

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

    psql -v ON_ERROR_STOP=1
    

    更好地使用-X 参数关闭.psqlrc 文件的使用。 非常适合我

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

    【讨论】:

    • -v ON_ERROR_STOP=ON 也有效,至少在 9.2 中有效。我怀疑任何variants of boolean "true" 都是允许的。
    • 它在交互模式下不起作用,这让我困惑了一分钟。
    【解决方案2】:

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

    \set ON_ERROR_STOP on
    

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

    你可能想使用 Paul 所说的事务。如果您不想更改脚本,也可以使用psql --single-transaction ... 来完成。

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

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

    【讨论】:

    • 即使事务失败,psql命令的退出状态还是0。
    • 确实,即使使用--single-transaction-v ON_ERROR_STOP=1 仍然是非零存在状态所必需的
    【解决方案3】:

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

    【讨论】:

    • 是的,但是,它仍然会解析所有内容。如果您只想在第一次成功后才进行 第二次 事务,那么这将行不通。
    • 是的,当遇到 DDL 创建表错误时不要忘记继续...(版本:postrgres 10)。是的,它会跳过一张桌子并进入其他桌子......
    【解决方案4】:

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

    来自PostgreSQL Manual

    退出状态

    psql 如果正常完成则返回 0 到 shell,如果是致命的则返回 1 发生自身的错误(例如内存不足、未找到文件),如果 与服务器的连接坏了,会话没有交互, 和 3 如果脚本和变量中发生错误 ON_ERROR_STOP 已设置。

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

    【讨论】:

      猜你喜欢
      • 2015-09-01
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      相关资源
      最近更新 更多