2014-03-25 76 views
1

我即將開始爲現有應用程序構建API,並且該數據庫已在生產中。功能將在未來逐漸移植到API中,應用程序將變得更加「以API爲中心」。在Laravel 4中爲現有數據庫創建遷移

其中一個主要的出發點是採用遷移和構建過程。對於在現有模式下創建遷移而不會在執行時破壞生產的最佳方式,我有所保留。

因爲我們希望快速地將功能移植到API中,所以我們理想地想要將我們當前的模式作爲構建過程的一部分重新創建並獲得一些核心單元測試 - 而不僅僅是爲將來創建遷移變化。

這是我對最好的開始地點不確定的地方。

這樣的任務的最佳方法是什麼?

  1. 可以導入當前模式作爲我們的第一次遷移嗎?
  2. 難道這最初的遷移被包裹在這樣的: if (App::environment() !== 'production'),以確保它不會在生產環境中執行?
  3. 可以排除特定環境的遷移或可能導致問題嗎?

有可能太簡單我缺少的另一種方法還是什麼? :)

回答

1

我不建議在運行生產環境遷移可言,但如果你必須再進行數據庫的備份副本,並在本地創建數據庫的副本,並進行遷移有再測試,使確定它一切正常。

  1. 您可以創建第一個遷移並手動添加所有架構佈局。但我實際上會在幾次遷移中做到這一點,讓每個表都作爲自己的遷移。
  2. 由於遷移從CLI使用工匠運行,你可以通過你想要的遷移要對運行環境和數據庫:

    工匠遷移--database =「則connectionName」 --env =「本地」

  3. 有運行在一個特定的環境遷移沒有問題,除了我上面所說的生產規定。

記得從步驟1(遷移文件名不包括擴展名,比如2014_03_25_143340_AddCountriesTable),以在數據庫中遷移表,在步驟2,否則運行以下命令將引發約表錯誤已經存在添加的所有現有架構佈局。

希望這會有所幫助。

+0

是否有任何理由,你不會跑在生產遷移?我想使用遷移之中的保護的理由是爲了防止它在生產環境中運行 - 櫃面有人不小心「遷移下來」和丟棄的所有表。 – acairns

+0

我有些喜歡做這個手工根據不同的項目,因爲我的,而不是被他們的自動化控制的變化。但這只是個人喜好。 –

3

我不久前創建了一個工具,它將生成當前數據庫模式的所有遷移。它還將新創建的遷移添加到遷移表中,因爲這些表已經存在。你可以在這裏得到它:https://github.com/Xethron/migrations-generator

其次,我用下面的代碼行中我DatabaseSeeder,但你可以把它添加到你希望在生產中禁用任何函數:

if (App::environment() === 'production') { 
    exit('Don\'t be stupid, this is a production server!!!'); 
} 

它不應該如果你通過拋出一個錯誤或者如上所述來停止執行,那麼這就成了一個問題。如果您不這樣做,Laravel會認爲這些更改已成功發生並將其從遷移表中刪除,並在運行遷移時導致錯誤。唯一的例外是,如果你同時排除向上和向下代碼(但是我不明白爲什麼你會想這樣做)

希望這有助於。

相關問題