我們有幾個遷移腳本,它們將模式從版本更改爲版本。如何繼續錯誤的sql腳本?
有時會發生移植步驟(例如向表中添加列)已經手動完成或通過修補程序安裝完成,因此遷移腳本失敗。
如何阻止腳本停止發生錯誤(理想情況下在特定的預期錯誤時),而是記錄一條消息並繼續執行腳本?
我們使用PostgresQL 9.1,PostgresQL的解決方案以及一般的SQL解決方案都可以。
我們有幾個遷移腳本,它們將模式從版本更改爲版本。如何繼續錯誤的sql腳本?
有時會發生移植步驟(例如向表中添加列)已經手動完成或通過修補程序安裝完成,因此遷移腳本失敗。
如何阻止腳本停止發生錯誤(理想情況下在特定的預期錯誤時),而是記錄一條消息並繼續執行腳本?
我們使用PostgresQL 9.1,PostgresQL的解決方案以及一般的SQL解決方案都可以。
儘管@ LucM的回答似乎是很好的建議 - @TomasGreif指出我的回答更符合我的出處要求。
對於添加一列的給定的例子,這可以通過使用DO
語句捕捉異常來完成:
DO $$
BEGIN
BEGIN
ALTER TABLE mytable ADD COLUMN counter integer default 0;
EXCEPTION
WHEN duplicate_column THEN RAISE NOTICE 'counter column already exists';
END;
END;
$$;
的提示引導我正確的PostgreSQL的網站,描述error codes一個可能的陷阱 - 這對我來說是正確的解決方案。
我不認爲你有另一種解決方案,而不是在事務之外運行整個腳本。
如果我是在那種情況下我會做:
感謝您的提示,這可能是一種方法。只有我希望能找到某些東西,我可以在某些情況下決定,我接受一個命令的錯誤,但希望繼續並繼續保留在完成的事務中,如前所述。 –
爲什麼不編寫腳本,所以像列添加一樣的任務只發生在列不存在? – HLGEM
@HLGEM:你會如何檢查它是否存在?而且,這僅僅是一個例子 - 它可以發生在所有的情況下,一個命令只能運行一次而沒有錯誤。 –
至於只有當它不存在時才添加列,那麼已經有一個[在SO上的答案](http://stackoverflow.com/questions/12597465/how-to-add-column-if-not-exists- on-postgresql) –