Bir Postgres komut dosyasını bir hatayla karşılaştığında nasıl durdurabilirim?


96

Bir sql betiğini çalıştırırken betikteki ilk hatayla karşılaştığında durduğunu, genellikle önceki hatalardan bağımsız olarak devam ettiğini belirtmenin bir yolu var mı?

Yanıtlar:


158

.Psqlrc'ye aşağıdakileri eklemek için çözümün mükemmellikten uzak olduğunu düşünüyorum

\set ON_ERROR_STOP on

çok daha basit ve kullanışlı bir yol var - psql parametresini kullanın:

psql -v ON_ERROR_STOP=1

-X.psqlrc dosya kullanımını kapatma parametresini kullanmak daha iyidir . Benim için mükemmel çalışıyor

Peter Eisentraut'un harika gönderisinde bulunan çözümü ps. Teşekkür ederim, Peter! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html


8
-v ON_ERROR_STOP=ONen az 9.2 ile de çalışır. Boolean "true" nun herhangi bir varyantına izin verildiğinden şüpheleniyorum .
jpmc26

Etkileşimli modda çalışmıyor, bu da bir dakika kafamı karıştırdı.
Sam Watkins

22

Kullandığınızı varsayıyorum psql, ~/.psqlrcdosyanıza eklemek kullanışlı olabilir .

\set ON_ERROR_STOP on

Bu, ilk hatada iptal edilmesini sağlayacaktır. Eğer buna sahip değilseniz, bir işlemle bile, komut dosyanızı çalıştırmaya devam edecek, ancak betiğinizin sonuna kadar her şeyde başarısız olacaktır.

Ve muhtemelen Paul'ün dediği gibi bir işlem kullanmak istersiniz. psql --single-transaction ...Senaryoyu değiştirmek istemiyorsanız, bu da yapılabilir .

Öyleyse, .psqlrc dosyanızda ON_ERROR_STOP ile eksiksiz bir örnek:

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

2
İşlem başarısız olsa bile, psql komutunun çıkış durumu hala 0'dır.
Dr. Person Kişi II

5
Nitekim, --single-transactionkullanılsa bile , -v ON_ERROR_STOP=1sıfır olmayan bir varoluş durumu için hala gereklidir
Alex Bitek

8

Tam olarak istediğiniz şey bu değil, ancak betiğinize ile başlar begin transaction;ve end transaction;onunla bitirirseniz, aslında ilk hatadan sonra her şeyi atlar ve sonra hatadan önce yaptığı her şeyi geri alır.


Doğru, ama yine de her şeyi ayrıştırıyor. Ve ikinci bir işlemi yalnızca ilk işlem başarılı olursa yapmak istiyorsanız , bu işe yaramayacaktır.
Joker Karakter

Evet, DDL Create table hatalarıyla karşılaştığında devam etmeyi unutmamak gerekir ... (sürüm: postrgres 10). Evet, bir masayı atlıyor ve diğerlerine gidiyor ...
JL Peyret

0

Her zaman doğrudan kılavuza başvurmayı seviyorum.

Gönderen PostgreSQL Manuel :

Çıkış Durumu

psql, normal şekilde bittiğinde kabuğa 0 döndürür, kendiliğinden ölümcül bir hata oluşursa 1 (örn. bellek yetersiz, dosya bulunamadı), sunucu bağlantısı kötüyse ve oturum etkileşimli değilse 2 ve eğer komut dosyasında bir hata oluştu ve ON_ERROR_STOP değişkeni ayarlandı.

Varsayılan olarak, PostgreSQL sunucu hatası psql üzerinde çalıştırdığınız sql kodu bir hatadan çıkmaz. Hatayı yakalayacak ve devam edecektir. Yukarıda bahsedildiği gibi ON_ERROR_STOPayarı on olarak ayarlarsanız, psql sql kodunda bir hata yakaladığında çıkacak ve 3kabuğa dönecektir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.