Bagaimana saya bisa menghentikan skrip Postgres ketika menemui kesalahan?

95

Apakah ada cara untuk menentukan bahwa saat menjalankan skrip sql berhenti saat menghadapi kesalahan pertama pada skrip, biasanya terus berlanjut, terlepas dari kesalahan sebelumnya.

sinar
sumber

Jawaban:

156

Saya pikir solusi untuk menambahkan berikut ke .psqlrc masih jauh dari kesempurnaan

\set ON_ERROR_STOP on

ada cara yang jauh lebih sederhana dan nyaman - gunakan psql dengan parameter:

psql -v ON_ERROR_STOP=1

lebih baik gunakan juga -Xparameter mematikan penggunaan file .psqlrc. Bekerja dengan sempurna untuk saya

ps solusinya ditemukan di posting bagus dari Peter Eisentraut. Terima kasih, Peter! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html

Alfishe
sumber
8
-v ON_ERROR_STOP=ONjuga bekerja, setidaknya dengan 9.2. Saya menduga salah satu varian boolean "benar" diizinkan.
jpmc26
Itu tidak berfungsi dalam mode interaktif, yang membuat saya bingung sebentar.
Sam Watkins
21

Saya berasumsi Anda sedang menggunakan psql, ini mungkin berguna untuk ditambahkan ke ~/.psqlrcfile Anda .

\set ON_ERROR_STOP on

Ini akan membatalkannya pada kesalahan pertama. Jika Anda tidak memilikinya, bahkan dengan transaksi itu akan terus mengeksekusi skrip Anda tetapi gagal pada semuanya sampai akhir skrip Anda.

Dan Anda mungkin ingin menggunakan transaksi seperti yang dikatakan Paul. Yang juga bisa dilakukan psql --single-transaction ...jika Anda tidak ingin mengubah skrip.

Jadi contoh lengkap, dengan ON_ERROR_STOP di .psqlrc Anda:

psql --single-transaction --file /your/script.sql
plundra
sumber
2
Bahkan jika transaksi gagal, status keluar dari perintah psql masih 0.
Dr. Person Person II
4
Memang, bahkan jika --single-transactiondigunakan, -v ON_ERROR_STOP=1masih diperlukan untuk status tidak nol yang ada
bitek
8

Ini tidak persis seperti yang Anda inginkan, tetapi jika Anda memulai skrip dengan begin transaction;dan diakhiri dengan end transaction;, itu benar-benar akan melewatkan semuanya setelah kesalahan pertama, dan kemudian akan mengembalikan semua yang dilakukannya sebelum kesalahan.

Paul Tomblin
sumber
Benar, tapi, masih mengurai semuanya. Dan jika Anda ingin melakukan transaksi kedua hanya jika yang pertama berhasil, ini tidak akan berhasil.
Wildcard
Ya, dan jangan lupa melanjutkan ketika menemukan DDL Buat kesalahan tabel ... (versi: postrgres 10). Ya, itu melompati satu meja dan pergi ke yang lain ...
JL Peyret
0

Saya selalu suka merujuk manual secara langsung.

Dari Manual PostgreSQL :

Status Keluar

psql mengembalikan 0 ke shell jika selesai secara normal, 1 jika terjadi kesalahan fatal sendiri (mis. kehabisan memori, file tidak ditemukan), 2 jika koneksi ke server rusak dan sesi tidak interaktif, dan 3 jika kesalahan terjadi dalam skrip dan variabel ON_ERROR_STOP ditetapkan.

Secara default jika kode sql yang Anda jalankan di server PostgreSQL error psql tidak akan menghentikan kesalahan. Ini akan menangkap kesalahan dan melanjutkan. Jika, seperti yang disebutkan di atas, Anda menyetel ON_ERROR_STOPpengaturan ke aktif, ketika psql menemukan kesalahan dalam kode sql, ia akan keluar dan kembali 3ke shell.

Gregory Arenius
sumber