Ошибка Postgres SQL при ошибке сценария - PullRequest
88 голосов
/ 19 декабря 2010

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

Спасибо

Ответы [ 4 ]

140 голосов
/ 26 апреля 2013

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

\set ON_ERROR_STOP on

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

psql -v ON_ERROR_STOP=1

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

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

14 голосов
/ 19 декабря 2010

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

\set ON_ERROR_STOP on

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

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

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

psql --single-transaction --file /your/script.sql
6 голосов
/ 19 декабря 2010

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

0 голосов
/ 23 августа 2018

Мне всегда нравится ссылаться на руководство напрямую.

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

Состояние выхода

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...