Как я могу остановить сценарий Postgres, когда он обнаруживает ошибку?

95

Есть ли способ указать, что при выполнении сценария sql он останавливается при обнаружении первой ошибки в сценарии, он обычно продолжается, независимо от предыдущих ошибок.

Рэй
источник

Ответы:

156

Я думаю, что решение добавить следующее в .psqlrc далеко от совершенства

\set ON_ERROR_STOP on

есть гораздо более простой и удобный способ - использовать psql с параметром:

psql -v ON_ERROR_STOP=1

Лучше использовать также -Xпараметр, отключающий использование файла .psqlrc. Отлично работает для меня

ps решение найдено в отличном посте от Питера Эйзентраута. Спасибо, Питер! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html

Альфише
источник
8
-v ON_ERROR_STOP=ONтоже работает, по крайней мере, с 9.2. Я подозреваю , что допустимы любые варианты логического "истина" .
jpmc26
В интерактивном режиме не работает, что меня на минуту смутило.
Сэм Уоткинс,
21

Я предполагаю, что вы используете psql, это может быть удобно для добавления в ваш ~/.psqlrcфайл.

\set ON_ERROR_STOP on

Это приведет к прерыванию работы при первой ошибке. Если у вас его нет, даже с транзакцией он продолжит выполнение вашего скрипта, но не сможет выполнить все до конца вашего скрипта.

И вы, вероятно, захотите использовать транзакцию, как сказал Пол. Что также можно сделать, psql --single-transaction ...если вы не хотите изменять сценарий.

Итак, полный пример с ON_ERROR_STOP в вашем .psqlrc:

psql --single-transaction --file /your/script.sql
Plundra
источник
2
Даже если транзакция не удалась, статус выхода команды psql по-прежнему равен 0.
Dr. Person Person II
4
В самом деле, даже если --single-transactionиспользуется, -v ON_ERROR_STOP=1все равно необходимо для ненулевого статуса существования
битек
8

Это не совсем то, что вы хотите, но если вы начнете свой скрипт с begin transaction;и закончите end transaction;, он фактически пропустит все после первой ошибки, а затем откатит все, что он делал до ошибки.

Пол Томблин
источник
Верно, но он все равно все разбирает. И если вы хотите выполнить вторую транзакцию только в случае успеха первой, это не сработает.
Wildcard
Да, и не забывать продолжать при обнаружении ошибок DDL Create table ... (версия: postrgres 10). Да, он пропускает один стол и переходит к другим ...
JL Peyret
0

Я всегда люблю напрямую обращаться к руководству.

Из руководства PostgreSQL :

Статус выхода

psql возвращает оболочке 0, если она завершилась нормально, 1, если произошла собственная фатальная ошибка (например, нехватка памяти, файл не найден), 2, если соединение с сервером ухудшилось и сеанс не был интерактивным, и 3, если в скрипте произошла ошибка и была установлена ​​переменная ON_ERROR_STOP.

По умолчанию, если код sql, который вы запускаете на сервере PostgreSQL, ошибается, psql не выдает ошибку. Он перехватит ошибку и продолжит работу. Если, как упоминалось выше, вы установите для этого ON_ERROR_STOPпараметра значение on, когда psql обнаружит ошибку в коде sql, он выйдет и вернется 3в оболочку.

Грегори Арениус
источник