2012-03-30 54 views
14

作爲previously discussed,我們正在開發一個圍繞Zend Framework的PHP應用程序,當我們在開發階段進行移動時,需要對數據庫進行相當頻繁的升級並以跨數據庫的方式進行升級。原則遷移是否可用於生產應用程序?

我們目前正在使用Rails Migrations進行此操作,儘管它們在Ruby中(而Windows上的Ruby就像是一團糟),但我們很難將遷移分發給具有基於Windows安裝的客戶。即使在Linux上,使用Ruby訪問MS SQL和Oracle數據庫也很痛苦。

我們希望用Doctrine's代替Rails Migrations,但他們覺得很不成熟。沒有太多的文檔和存在的一些跟蹤該錯誤提高對項目的狀態紅旗,如:

看代碼,這兩個實際上下降原始表或列,並重新創建它,而不保留數據。這是一個完全的交易斷路器,讓我覺得沒有人真正使用Doctrine Migrations。

此外,我認爲遷移使用順序編號(第1版,第2版等),使它們完全不適合枝發展的文件中讀出,但隨後DoctrineMigrationsBundle Symfony documentation使用基於日期的版本的有意義。

有沒有人有該工具的真實世界的經驗,或知道它的發展狀態?

+0

老實說,我很驚訝缺乏這個工具。我想持續的開發/發佈並不像我想的那麼大。 – GomoX 2012-04-03 20:51:33

回答

7

說實話,主義遷移比大多數的產品更好;然而,它們有點不成熟,很難找到文件。這就是說,如果保持在有限的範圍內,他們工作得很好。

此外,使用任何遷移工具,您只需要小心,不要期望它提供魔法。這就是說,沒有一個跨平臺的工具是功能完整的,並且在野外被證明是liquibase。此外,我不知道其他工具包括數據庫文檔工具。

上liquibase下面說說應爲您提供足夠的信息,讓你開始:

http://slidedecks.wilmoore.com/2012-confoo/painless-version-controlled-database-refactoring

+0

感謝您的概述,我現在知道它的大部分內容,但一年前會發現它非常有用:)這說,Liquibase只是數據庫遷移,而在Ruby中使用獨立遷移,我可以在我的數據操作遷移也是如此。具有Migrations的AR界面允許我以非常簡單的方式執行此操作。另一方面,Liquibase中的XML描述不提供任何支持。我錯過了什麼? – GomoX 2012-04-03 02:18:30

+0

如果通過「數據操作」,您的意思是插入,更新,刪除數據,當然,您可以使用Liquibase完成所有操作。 – 2012-04-03 06:13:50

+0

但它必須是靜態數據。我無法計算出另一個新列的值,或者類似的東西,對嗎?我需要某種腳本。 – GomoX 2012-04-03 11:49:23

2

如果你正在尋找學說2,那麼它可能會有點不成熟,特別是如果你'只想使用Migrations庫。從我作爲一個獨立庫的經驗來看,它不是Doctrine2 ORM的一部分,它不是一個可靠的產品。值得稱讚的是,它仍然是Alpha,作爲完整ORM的Doctrine是一個非常好的庫(遷移作爲其一部分工作得很好)。

我已經在許多生產環境中使用Doctrine 1.X作爲完整的ORM和遷移,並且它工作得很好。

+0

但是Doctrine 1.x不再被維護,而Doctrine 2似乎是標準版本。我什至不能找到如何使用Doctrine 1的例子,並沒有被維護它似乎並不是一個好主意。 – GomoX 2012-04-03 02:19:37

14

我們查看了更多關於Doctrine Migrations的內容,並對其內部工作進行了一些瞭解(並更新了OP中鏈接的錯誤)。

主要問題是,學說有一個從根本上不同的遷移方法。它從數據庫模式中構建一個抽象模型,然後允許您修改該模型。這些修改對底層數據庫沒有影響,但Doctrine使用它們來推斷必須在數據庫上進行的實際更改。

這就像數據庫的差異。這有一些非常不好的後果。例如,如果您在模型上的DB重命名列的操作是這樣的:

public function renameColumn($oldColumnName, $newColumnName) 
{ 
    $column = $this->getColumn($oldColumnName); 
    $this->dropColumn($oldColumnName); 

    $column->_setName($newColumnName); 
    return $this; 
} 

如果您使用此功能,然後有學說應用的遷移,它會再看看老之間的差異新的模式(缺失的列,添加的列和其類型),並推斷是否需要重命名現有列或刪除舊列並創建新列。這意味着Doctrine認爲重命名專欄實際上與刪除專欄並重新創建專欄相同,因此非常愚蠢。

  • 如果您重命名單個列而不更改其他任何內容,它將在DBMS上發出「重命名」命令。
  • 如果您重命名列並將其類型(例如,varchar(80)更改爲varchar(100),它會將其刪除並重新創建它
  • 如果您重命名2列並且不更改任何內容,會驚慌失措,並重新創建它們(差異算法是最基本的)

我認爲這是一個糟糕的數據庫遷移方法,因爲它不能可靠地工作。在遷移過程中,這不符合基本要求

這就是說,我們正在使用它,因爲沒有什麼更好的了。 e不可靠操作中的失敗消息,以避免讓開發人員陷入許多陷阱。

+0

您是否建議Doctrine在丟棄並重新創建列時丟失數據?因爲那肯定會使它在生產環境中無法使用? – Prathap 2013-10-02 18:12:29

+0

確實。您需要謹慎行事,以避免因行爲不當而導致數據丟失。 – GomoX 2013-10-10 14:55:08

+0

現在已經3年了,你還在使用Doctrine提供的遷移,還是改成了別的東西? – JCM 2015-10-30 18:30:26

相關問題