ฉันจะหยุดสคริปต์ Postgres ได้อย่างไรเมื่อพบข้อผิดพลาด


96

มีวิธีระบุหรือไม่ว่าเมื่อเรียกใช้สคริปต์ sql มันจะหยุดเมื่อพบข้อผิดพลาดแรกบนสคริปต์โดยปกติจะดำเนินต่อไปโดยไม่คำนึงถึงข้อผิดพลาดก่อนหน้านี้

คำตอบ:


158

ฉันคิดว่าวิธีการเพิ่มการติดตามใน. psqlrc ยังห่างไกลจากความสมบูรณ์แบบ

\set ON_ERROR_STOP on

มีวิธีที่ง่ายและสะดวกกว่ามาก - ใช้ psql กับพารามิเตอร์:

psql -v ON_ERROR_STOP=1

ดีกว่าที่จะใช้-Xพารามิเตอร์ปิดการใช้งานไฟล์. psqlrc ทำงานได้ดีสำหรับฉัน

ps วิธีแก้ปัญหาที่พบในโพสต์ที่ยอดเยี่ยมจาก Peter Eisentraut ขอบคุณปีเตอร์! http://petereisentraut.blogspot.com/2010/03/running-sql-scripts-with-psql.html


8
-v ON_ERROR_STOP=ONยังใช้งานได้อย่างน้อยด้วย 9.2 ฉันสงสัยว่ามีการอนุญาตให้ใช้บูลีน "จริง"ในรูปแบบต่างๆ
jpmc26

มันไม่ทำงานในโหมดโต้ตอบซึ่งทำให้ฉันสับสนไปหนึ่งนาที
Sam Watkins

22

ฉันคิดว่าคุณกำลังใช้psqlสิ่งนี้อาจเป็นประโยชน์ในการเพิ่มลงใน~/.psqlrcไฟล์ของคุณ

\set ON_ERROR_STOP on

ซึ่งจะทำให้ล้มเลิกข้อผิดพลาดแรก หากคุณไม่มีแม้ว่าจะมีธุรกรรมก็จะยังคงเรียกใช้สคริปต์ของคุณ แต่ล้มเหลวในทุกอย่างจนกว่าจะสิ้นสุดสคริปต์ของคุณ

และคุณอาจต้องการใช้ธุรกรรมตามที่ Paul กล่าว ซึ่งสามารถทำได้psql --single-transaction ...หากคุณไม่ต้องการแก้ไขสคริปต์

ตัวอย่างที่สมบูรณ์โดยมี ON_ERROR_STOP ใน. psqlrc ของคุณ:

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

2
แม้ว่าธุรกรรมจะล้มเหลวสถานะการออกของคำสั่ง psql ยังคงเป็น 0
ดร. Person Person II

5
อันที่จริงแม้ว่า--single-transactionจะใช้แล้ว -v ON_ERROR_STOP=1ก็ยังจำเป็นสำหรับสถานะที่ไม่มีอยู่
Alex Bitek

8

ไม่ใช่สิ่งที่คุณต้องการ แต่ถ้าคุณเริ่มต้นสคริปต์ของคุณbegin transaction;และลงท้ายด้วยend transaction;จริง ๆ แล้วมันจะข้ามทุกอย่างหลังจากเกิดข้อผิดพลาดครั้งแรกจากนั้นมันจะย้อนกลับทุกสิ่งที่ทำก่อนเกิดข้อผิดพลาด


จริง แต่มันยังคงแยกวิเคราะห์ทุกอย่าง และหากคุณต้องการทำธุรกรรมครั้งที่สองต่อเมื่อครั้งแรกสำเร็จสิ่งนี้จะไม่ได้ผล
Wildcard

ใช่และอย่าลืมดำเนินการต่อเมื่อพบข้อผิดพลาด DDL Create table ... (version: postrgres 10) ใช่มันข้ามโต๊ะเดียวและไปที่โต๊ะอื่น ๆ ...
JL Peyret

0

ฉันมักจะอ้างอิงคู่มือโดยตรง

จากคู่มือ PostgreSQL :

ออกจากสถานะ

psql จะส่งคืน 0 ไปยังเชลล์หากเสร็จสิ้นตามปกติ 1 หากเกิดข้อผิดพลาดร้ายแรงของตัวมันเอง (เช่นหน่วยความจำไม่พบไฟล์) 2 หากการเชื่อมต่อกับเซิร์ฟเวอร์เสียและเซสชันไม่โต้ตอบและ 3 ถ้า เกิดข้อผิดพลาดในสคริปต์และมีการตั้งค่าตัวแปร ON_ERROR_STOP

ตามค่าเริ่มต้นถ้ารหัส sql ที่คุณกำลังเรียกใช้บนข้อผิดพลาดของเซิร์ฟเวอร์ PostgreSQL psql จะไม่ออกจากข้อผิดพลาด มันจะจับข้อผิดพลาดและดำเนินการต่อ หากดังที่กล่าวไว้ข้างต้นคุณตั้งค่าการON_ERROR_STOPตั้งค่าเป็นเปิดเมื่อ psql ตรวจพบข้อผิดพลาดในโค้ด sql มันจะออกและกลับ3ไปที่เชลล์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.