Як я можу зупинити скрипт 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. Я підозрюю, що будь-який із варіантів логічного "true" дозволений.
jpmc26

Це не працює в інтерактивному режимі, що мене збентежило на хвилину.
Sam Watkins

21

Я припускаю, що ви використовуєте psql, це може бути зручно додати до вашого ~/.psqlrcфайлу.

\set ON_ERROR_STOP on

Це призведе до переривання з першої помилки. Якщо у вас його немає, навіть під час транзакції він буде продовжувати виконувати ваш сценарій, але не працюватиме до кінця вашого сценарію.

І ви, мабуть, хочете скористатися транзакцією, як сказав Пол. Що також можна зробити, psql --single-transaction ...якщо ви не хочете змінювати сценарій.

Отже, повний приклад з ON_ERROR_STOP у вашому .psqlrc:

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

2
Навіть якщо транзакція не вдається, статус виходу команди psql все ще дорівнює 0.
Dr. Person Person II

4
Дійсно, навіть якщо --single-transactionвоно використовується, -v ON_ERROR_STOP=1все одно необхідно для ненульового статусу існування
bitek

8

Це не зовсім те, що ви хочете, але якщо ви почнете свій сценарій із begin transaction;і закінчите end transaction;, він фактично пропустить все після першої помилки, а потім відкатить усе, що робив до помилки.


Правда, але все одно все аналізує. І якщо ви хочете зробити другу транзакцію, лише якщо перша вдалася, це не спрацює.
Wildcard

Так, і не забувати продовжувати, коли він стикається з помилками створення таблиці DDL ... (версія: postrgres 10). Так, він пропускає один стіл, а переходить на інші ...
JL

0

Я завжди люблю посилатися на посібник безпосередньо.

З посібника PostgreSQL :

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

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

За замовчуванням, якщо код SQL, який ви використовуєте на помилці сервера PostgreSQL, psql не виведе помилку. Це виявить помилку і продовжить. Якщо, як уже згадувалося вище, ви встановите ON_ERROR_STOPпараметр увімкнено, коли psql виявить помилку в коді sql, він вийде і повернеться 3до оболонки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.