2014-06-26 199 views
4

我們有幾個遷移腳本,它們將模式從版本更改爲版本。如何繼續錯誤的sql腳本?

有時會發生移植步驟(例如向表中添加列)已經手動完成或通過修補程序安裝完成,因此遷移腳本失敗。

如何阻止腳本停止發生錯誤(理想情況下在特定的預期錯誤時),而是記錄一條消息並繼續執行腳本?

我們使用PostgresQL 9.1,PostgresQL的解決方案以及一般的SQL解決方案都可以。

+1

爲什麼不編寫腳本,所以像列添加一樣的任務只發生在列不存在? – HLGEM

+0

@HLGEM:你會如何檢查它是否存在?而且,這僅僅是一個例子 - 它可以發生在所有的情況下,一個命令只能運行一次而沒有錯誤。 –

+1

至於只有當它不存在時才添加列,那麼已經有一個[在SO上的答案](http://stackoverflow.com/questions/12597465/how-to-add-column-if-not-exists- on-postgresql) –

回答

2

儘管@ 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一個可能的陷阱 - 這對我來說是正確的解決方案。

1

我不認爲你有另一種解決方案,而不是在事務之外運行整個腳本。

如果我是在那種情況下我會做:

  • 執行修改元數據(下降/創建表/列...)一 交易的
  • 對中的數據進行所有修改(更新/插入/刪除) 一個事務。
+0

感謝您的提示,這可能是一種方法。只有我希望能找到某些東西,我可以在某些情況下決定,我接受一個命令的錯誤,但希望繼續並繼續保留在完成的事務中,如前所述。 –