[PostgreSQL] psql 在遇到錯誤時回傳值不是零?
昨天注意到了在用 psql 執行 SQL 檔案時,明明指令出錯了,
可是 psql 的回傳值卻是 0,導致我們的程式誤以為 psql 沒有出錯~
舉例來說,下面是一個測試用的 SQL 檔案:
ALTER TABLE tbl_group ALTER COLUMN GroupType SET NOT NULL; UPDATE tbl_group SET GroupType=0 WHERE ID > 10;
假設在 tbl_group 裡的 GroupType 目前有 NULL 值的話,ALTER TABLE 指令會失敗,
但 psql 會接著執行下面的 UPDATE 指令,指令成功,因此 psql 回傳值是 0:
testuser@localhost $ psql -U testuser -d testdb -f testsql.sql psql:testsql.sql:2: ERROR: column "grouptype" contains null values UPDATE 4 testuser@localhost $ echo $? 0
查了一下 PostgreSQL: psql 的文件,上面寫說 psql 的回傳值是:
– 0 代表正常結束
– 1 代表有嚴重的錯誤 (如記憶體不足、檔案找不到)
– 2 代表無法連線到 server
– 3 代表 script 中有錯誤,但這只在參數 ON_ERROR_STOP 有設定的狀況下才會出現
文件中也說,預設狀況下,psql 會略過錯誤,繼續執行下面的指令…
看來這就是導致我們程式錯誤的原因~
要解決這個問題,可以有兩個方法~
1. 檢查 psql 的 stderr 輸出
在剛剛的 psql 的 stderr 那邊,
其實是有輸出 “ERROR: column “grouptype” contains null values” 的,
所以可以判斷 stderr 輸出是否為空,來得知執行有無成功~
2. 加上 ON_ERROR_STOP 的參數
在 psql 指令中,加上 -v ON_ERROR_STOP=1 的參數:
testuser@localhost $ psql -U testuser -d testdb -v ON_ERROR_STOP=1 -f testsql.sql psql:testsql.sql:2: ERROR: column "grouptype" contains null values testuser@localhost $ echo $? 3
可以看到加上 ON_ERROR_STOP=1 之後,
psql 會在遇到錯誤後立刻停止 (不執行接下來的 UPDATE),並回傳 3~
(這邊的 ON_ERROR_STOP 的值似乎設成 1, on, yes, true 都可以)
(本頁面已被瀏覽過 437 次)