Come posso interrompere uno script Postgres quando riscontra un errore?


95

C'è un modo per specificare che quando si esegue uno script sql si arresta quando si incontra il primo errore nello script, di solito continua, indipendentemente dagli errori precedenti.

Risposte:


156

Penso che la soluzione per aggiungere il seguito a .psqlrc sia lontana dalla perfezione

\set ON_ERROR_STOP on

esiste un modo molto più semplice e conveniente: usa psql con parametro:

psql -v ON_ERROR_STOP=1

meglio usare anche -X parametro che disattiva l'utilizzo del file .psqlrc. Funziona perfettamente per me

ps la soluzione trovata in ottimo post da Peter Eisentraut. Grazie Peter! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html


8
-v ON_ERROR_STOP=ONfunziona anche, almeno con 9.2. Sospetto che sia consentita una qualsiasi delle varianti di booleano "true" .
jpmc26

Non funziona in modalità interattiva, il che mi ha confuso per un minuto.
Sam Watkins

21

Presumo che tu stia usando psql, questo potrebbe essere utile da aggiungere al tuo ~/.psqlrcfile.

\set ON_ERROR_STOP on

Questo lo interromperà al primo errore. Se non lo hai, anche con una transazione continuerà a eseguire lo script ma fallirà su tutto fino alla fine dello script.

E probabilmente vorrai usare una transazione come ha detto Paul. Che può essere fatto anche psql --single-transaction ...se non si desidera modificare lo script.

Quindi un esempio completo, con ON_ERROR_STOP nel tuo .psqlrc:

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

2
Anche se la transazione fallisce, lo stato di uscita del comando psql è ancora 0.
Dr. Person Person II

4
Infatti, anche se --single-transactionutilizzato, -v ON_ERROR_STOP=1è comunque necessario per uno stato di esistenza diverso da zero
bitek

8

Non è esattamente quello che vuoi, ma se inizi lo script con begin transaction;e finisci con end transaction;, in realtà salterà tutto dopo il primo errore, quindi ripristinerà tutto ciò che ha fatto prima dell'errore.


Vero, ma analizza ancora tutto. E se vuoi fare una seconda transazione solo se la prima è andata a buon fine, non funzionerà.
Wildcard

Sì, e non dimenticare di continuare quando incontra errori di tabella DDL Create ... (versione: postrgres 10). Sì, salta un tavolo e passa agli altri ...
JL Peyret

0

Mi piace sempre fare riferimento direttamente al manuale.

Dal manuale PostgreSQL :

Stato di uscita

psql restituisce 0 alla shell se è terminata normalmente, 1 se si verifica un errore fatale (ad esempio memoria insufficiente, file non trovato), 2 se la connessione al server è andata male e la sessione non era interattiva e 3 se si è verificato un errore in uno script ed è stata impostata la variabile ON_ERROR_STOP.

Per impostazione predefinita, se il codice sql in esecuzione sul server PostgreSQL errore psql non uscirà da un errore. Rileverà l'errore e continuerà. Se, come accennato in precedenza, si imposta l' ON_ERROR_STOPimpostazione su on, quando psql rileva un errore nel codice sql, uscirà e tornerà 3alla shell.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.