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

发布于 2024-10-08 18:06:26 字数 57 浏览 9 评论 0原文

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

Is there a way to specify that when executing a sql script it stops when encountering the first error on the script, it usually continues, regardless of previous errors.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

゛时过境迁 2024-10-15 18:06:26

我认为向 .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-脚本-with-psql.html

I think the solution to add following to .psqlrc is far from perfection

\set ON_ERROR_STOP on

there exists much more simple and convenient way - use psql with parameter:

psql -v ON_ERROR_STOP=1

better to use also -X parameter turning off .psqlrc file usage.
Works perfectly for me

p.s. the solution found in great post from Peter Eisentraut. Thank you, Peter!
http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html

何时共饮酒 2024-10-15 18:06:26

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

\set ON_ERROR_STOP on

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

正如保罗所说,你可能想使用交易。如果您不想更改脚本,也可以使用 psql --single-transaction ... 来完成。

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

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

I assume you are using psql, this might be handy to add to your ~/.psqlrc file.

\set ON_ERROR_STOP on

This will make it abort on the first error. If you don't have it, even with a transaction it will keep executing your script but fail on everything until the end of your script.

And you probably want to use a transaction as Paul said. Which also can be done with psql --single-transaction ... if you don't want to alter the script.

So a complete example, with ON_ERROR_STOP in your .psqlrc:

psql --single-transaction --file /your/script.sql
月棠 2024-10-15 18:06:26

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

It's not exactly what you want, but if you start your script with begin transaction; and end with end transaction;, it will actually skip everything after the first error, and then it will rollback everything it did before the error.

旧街凉风 2024-10-15 18:06:26

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

来自 PostgreSQL 手册

退出状态

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

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

I always like to reference the manual directly.

From the PostgreSQL Manual:

Exit Status

psql returns 0 to the shell if it finished normally, 1 if a fatal
error of its own occurs (e.g. out of memory, file not found), 2 if the
connection to the server went bad and the session was not interactive,
and 3 if an error occurred in a script and the variable
ON_ERROR_STOP was set.

By default if the sql code you are running on the PostgreSQL server error psql won't quit an error. It will catch the error and continue. If, as mentioned above, you set the ON_ERROR_STOP setting to on, when psql catches an error in the sql code it will exit and return 3 to the shell.

心作怪 2024-10-15 18:06:26

例如,您可以启用 当您使用用户 john 和数据库 apple 登录时,ON_ERROR_STOP 默认为 off,如下所示。 *ON_ERROR_STOP 在注销后自动关闭

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 

并且,当您从文件 test.sql< 运行脚本时,您可以启用 ON_ERROR_STOP /code> 如下所示:

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

并且,您可以在登录后启用 ON_ERROR_STOP 如下所示:

\set ON_ERROR_STOP on

或者。 *此命令只能启用ON_ERROR_STOP,而无需切换onoff

\set ON_ERROR_STOP

并且,您可以显示ON_ERROR_STOP的值与 \echo 为如下所示。 *不要忘记在 ON_ERROR_STOP 之前添加 :

postgres=# \echo :ON_ERROR_STOP
on

*备注:

  • 不要使用小写的 on_error_stop,它不会工作。

  • 您可以使用 oN1TrUetR 启用 ON_ERROR_STOP

  • 您可以使用 oFf0FaLsEfA 禁用 ON_ERROR_STOP

  • 当您从文件运行脚本时,错误不会停止执行。

  • 带有 DEBUG 的 RAISE 语句LOGINFONOTICEWARNING 即使 ON_ERROR_STOP< 也无法停止执行/code> 是 on,而 RAISE 语句带有 EXCEPTION 或什么都不能。 *我的问题对此进行了解释详细信息。


For example, you can enable ON_ERROR_STOP which is off by default when you log in with the user john and the database apple as shown below. *ON_ERROR_STOP is off automatically after logout:

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 

And, you can enable ON_ERROR_STOP when you run a script from the file test.sql as shown below:

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

And, you can enable ON_ERROR_STOP after login as shown below:

\set ON_ERROR_STOP on

Or. *This command can only enable ON_ERROR_STOP without toggling on and off:

\set ON_ERROR_STOP

And, you can show the value of ON_ERROR_STOP with \echo as shown below. *Don't forget to put : just before ON_ERROR_STOP:

postgres=# \echo :ON_ERROR_STOP
on

*Memos:

  • Don't use the lowercase on_error_stop which doesn't work.

  • You can enable ON_ERROR_STOP with oN, 1, TrUe, tR, etc.

  • You can disable ON_ERROR_STOP with oFf, 0, FaLsE, fA, etc.

  • It happens that error doesn't stop execution when you run a script from a file.

  • RAISE statement with DEBUG, LOG, INFO, NOTICE or WARNING cannot stop execution even if ON_ERROR_STOP is on while RAISE statement with EXCEPTION or nothing can. *My question explains it in detail.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文