Làm cách nào để dừng tập lệnh Postgres khi nó gặp lỗi?


95

Có cách nào để chỉ định rằng khi thực thi một tập lệnh sql, nó sẽ dừng lại khi gặp lỗi đầu tiên trên tập lệnh, nó thường tiếp tục, bất kể lỗi trước đó.

Câu trả lời:


156

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 -Xtham 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


8
-v ON_ERROR_STOP=ONcũ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.
jpmc26

Nó không hoạt động ở chế độ tương tác, điều này khiến tôi bối rối trong một phút.
Sam Watkins,

21

Tôi giả sử bạn đang sử dụng psql, điều này có thể hữu ích để thêm vào ~/.psqlrctệ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

2
Thậm chí nếu giao dịch không thành công, trạng thái thoát của lệnh psql vẫn là 0.
Tiến sĩ Person Người II

4
Thật vậy, ngay cả khi --single-transactionđược sử dụng, -v ON_ERROR_STOP=1vẫn cần thiết cho trạng thái tồn tại khác 0
cắnk

8

Đó 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.


Đúng, nhưng, nó vẫn phân tích mọi thứ. Và nếu bạn muốn thực hiện giao dịch thứ hai chỉ khi giao dịch đầu tiên thành công, điều này sẽ không hoạt động.
tự đại diện

Có, và đừng quên tiếp tục khi nó gặp lỗi DDL Tạo bảng ... (phiên bản: postrgres 10). Vâng, nó bỏ qua một bảng và đi vào người khác ...
JL Peyret

0

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_STOPcài đặt thành bật, khi psql bắt lỗi trong mã sql, nó sẽ thoát và trở lại 3trình bao.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.