2014-04-28 107 views
23

相對於僅運行模式更新,Doctrine Migrations具有什麼實際優勢?學說模式更新或學說遷移

安全?

orm:schema-tool:update命令(doctrine:schema:update在Symfony的)警告

此操作不應該在生產環境中被執行。

但這是爲什麼?當然,它可以刪除數據,但遷移也是如此。

靈活性?

我認爲我可以定製我的遷移以添加像列默認值這樣的東西,但這通常不起作用,因爲Doctrine會注意到架構和下一個diff的代碼之間的差異,並踩踏您的更改。

回答

36

當您使用schema-tool,沒有數據庫修改的歷史記錄保存,並在生產/舞臺環境中,這是一個很大的弊端。

假設您在活動項目中擁有複雜的數據庫結構。在下一個變更集中,您必須以某種方式更改數據庫。例如,用戶的聯繫人電話需要以不同的格式存儲,而不是VARCHAR,而是三個SMALLINT列的國家/地區代碼,區號和電話號碼。

好吧,這不是很難找出一個查詢當前的數據,將它分成三個值並將其插回。這就是遷移的過程:您可以創建新的字段,然後進行轉換,最後刪除之前保存數據的字段。

甚至更​​多!當您需要撤消遷移中引入的更改時,您甚至可以描述向後過程(down遷移)。我們假設某個地方很大程度上依賴於VARCHAR字段的格式,並且現在您已經更改了結構,但他的代碼片段沒有按預期工作。所以,你運行migration:down,並且一切都恢復。在這種特定情況下,您只需將舊的VARCHAR列帶回並連接值,然後刪除這些字段。

主義的遷移工具基本上爲您做了大部分工作。當您對模式進行比較時,它會生成所有必需的updown,因此您只需處理在應用遷移時可能損壞的數據。

此外,遷移是讓團隊中的其他開發人員瞭解何時需要更新模式的知識。只需要schema-tool,你的隊友每次運行時都必須運行doctrine:schema:update,因爲他們不知道模式是否真的發生了變化。

使用遷移時,您總是會看到migrations文件夾中有一些更新,這意味着您需要更新模式。

+1

非常好的答案,不能做得更清楚我自己:) – Wcool

+0

@Wcool,謝謝:) – kix

+2

非常有幫助的回答。非常感謝。 –

1

我認爲你確實已經將它釘在安全上。有了Migrations,你可以回到表格的另一個狀態(就像你可以在Git版本控制中一樣)。使用模式更新命令,您只能更新表格。如果在這些表中已保存的數據發生故障,則不會保留日誌。我不完全知道,但是遷移也不會保存正在更新的相應表的數據嗎?這在我看來是非常重要的,否則沒有什麼大的理由去使用它們。

所以是的,我個人認爲在生產環境中使用遷移的主要原因是安全性,也許有一點靈活性。安全將在這裏贏家我認爲:)

希望這會有所幫助。

編輯:這裏是對的Symfony文檔引用另一個答案:Is it safe to use doctrine2 migrations in production environment with symfony2 and php