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

问题描述 投票:0回答:5

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

database postgresql error-handling psql sql-scripts
5个回答
220
投票

我认为向 .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


34
投票

我假设您正在使用

psql
,这可能会很方便添加到您的
~/.psqlrc
文件中。

\set ON_ERROR_STOP on

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

你可能想使用保罗所说的交易。如果您不想更改脚本,也可以使用

psql --single-transaction ...
来完成。

这是一个完整的示例,在 .psqlrc 中包含 ON_ERROR_STOP:

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

9
投票

这并不完全是你想要的,但如果你的脚本以

begin transaction;
开始并以
end transaction;
结束,它实际上会跳过第一个错误之后的所有内容,然后它将回滚在错误之前执行的所有操作。


1
投票

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

来自 PostgreSQL 手册

退出状态

psql 如果正常完成则向 shell 返回 0,如果致命则返回 1 发生自身错误(例如内存不足、未找到文件),如果发生错误则为 2 与服务器的连接出现问题并且会话无法交互, 3 如果脚本和变量中发生错误 ON_ERROR_STOP 已设置。

默认情况下,如果您在 PostgreSQL 服务器上运行的 sql 代码出现错误,psql 不会退出错误。它将捕获错误并继续。如果如上所述,将

ON_ERROR_STOP
设置为 on,则当 psql 捕获 sql 代码中的错误时,它将退出并将
3
返回到 shell。


0
投票

例如,您可以启用ON_ERROR_STOP,当您使用用户

off
和数据库
john
登录时,默认为
apple
,如下所示:

psql -U john -v ON_ERROR_STOP=on apple
psql -U john --variable=ON_ERROR_STOP=on apple
psql -U john --set=ON_ERROR_STOP=on apple 

并且,当您使用

psql
从文件
ON_ERROR_STOP
运行脚本时,您可以启用 test.sql,如下所示:

psql -U john -v ON_ERROR_STOP=on -f test.sql apple

并且,您可以在登录后启用

ON_ERROR_STOP
,如下所示:

\set ON_ERROR_STOP on

或者。 *此命令只能启用

ON_ERROR_STOP
,而不能切换
on
off
:

\set ON_ERROR_STOP

并且,您可以使用

 cho
显示 ON_ERROR_STOP 的值,如下所示。 *别忘了在
:
之前加上
ON_ERROR_STOP
:

postgres=# \echo :ON_ERROR_STOP
on

*备注:

  • 不要使用小写字母

    on_error_stop
    ,这不起作用。

  • 您可以使用

    ON_ERROR_STOP
    oN
    1
    TrUe
    等启用
    tR

  • 您可以使用

    ON_ERROR_STOP
    oFf
    0
    FaLsE
    等禁用
    fA

© www.soinside.com 2019 - 2024. All rights reserved.