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

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于遇到错误时如何停止 Postgres 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Docker环境中启动时,如何从节点服务器连接到postgres

如何在 Postgres 中删除区分大小写?

迁移postgres时序列错误脚本修复

vbs 脚本 复制文件中遇到的错误

kettle的报错解决机制

尝试运行“应用程序一直在停止”的应用程序时遇到以下错误如何解决?