Câu trả lời:
Tôi nghĩ rằng giải pháp để thêm sau vào .psqlrc là không hoàn hảo
\set ON_ERROR_STOP on
tồn tại một cách đơn giản và thuận tiện hơn nhiều - sử dụng psql với tham số:
psql -v ON_ERROR_STOP=1
tốt hơn để sử dụng cũng -X
tham số tắt sử dụng tệp .psqlrc. Hoạt động hoàn hảo cho tôi
ps giải pháp được tìm thấy trong bài đăng tuyệt vời từ Peter Eisentraut. Cảm ơn bạn, Peter! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html
Tôi giả sử bạn đang sử dụng psql
, điều này có thể hữu ích để thêm vào ~/.psqlrc
tệp của bạn .
\set ON_ERROR_STOP on
Điều này sẽ làm cho nó bị hủy bỏ ở lỗi đầu tiên. Nếu bạn không có nó, ngay cả với một giao dịch, nó sẽ tiếp tục thực thi tập lệnh của bạn nhưng không thành công trên mọi thứ cho đến khi kết thúc tập lệnh của bạn.
Và bạn có thể muốn sử dụng một giao dịch như Paul đã nói. Điều này cũng có thể được thực hiện với psql --single-transaction ...
nếu bạn không muốn thay đổi tập lệnh.
Vì vậy, một ví dụ hoàn chỉnh, với ON_ERROR_STOP trong .psqlrc của bạn:
psql --single-transaction --file /your/script.sql
--single-transaction
được sử dụng, -v ON_ERROR_STOP=1
vẫn cần thiết cho trạng thái tồn tại khác 0
Đó không phải là chính xác những gì bạn muốn, nhưng nếu bạn bắt đầu tập lệnh của mình begin transaction;
và kết thúc bằng end transaction;
, nó sẽ thực sự bỏ qua mọi thứ sau lỗi đầu tiên và sau đó nó sẽ quay lại mọi thứ mà nó đã làm trước khi gặp lỗi.
Tôi luôn thích tham khảo hướng dẫn sử dụng trực tiếp.
Từ Hướng dẫn PostgreSQL :
Trạng thái thoát
psql trả về 0 cho shell nếu nó kết thúc bình thường, 1 nếu lỗi nghiêm trọng của chính nó xảy ra (ví dụ: hết bộ nhớ, không tìm thấy tệp), 2 nếu kết nối với máy chủ bị lỗi và phiên không tương tác và 3 nếu đã xảy ra lỗi trong tập lệnh và biến ON_ERROR_STOP đã được đặt.
Theo mặc định, nếu mã sql bạn đang chạy trên máy chủ PostgreSQL lỗi thì psql sẽ không thoát lỗi. Nó sẽ bắt lỗi và tiếp tục. Nếu, như đã đề cập ở trên, bạn đặt ON_ERROR_STOP
cài đặt thành bật, khi psql bắt lỗi trong mã sql, nó sẽ thoát và trở lại 3
trình bao.
-v ON_ERROR_STOP=ON
cũng hoạt động, ít nhất là với 9,2. Tôi nghi ngờ rằng bất kỳ biến thể nào của boolean "true" đều được phép.