[PostgreSQL] psql 在遇到錯誤時回傳值不是零?

[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 都可以)

 

 

(本頁面已被瀏覽過 64 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料