2013-09-24 34 views
2

假設我已經有一個應用程序,其中包含大量遷移文件,我準備第一次將它們部署到生產環境中。據我瞭解,我有兩個基本的選擇,以獲得最高分貝在生產服務器上:db:schema:load如何影響未來數據庫:遷移動作

  • A - 運行db:migrate,並使其循環所有的遷移還沒有運行
  • 乙 - 運行db:schema:load,並將它從架構文件

建立DB我知道B是新鮮的部署是正確的選擇,因爲在schema.rb評論解釋說:

# If you need to create the application database on another 
# system, you should be using db:schema:load, not running all the migrations 
# from scratch. The latter is a flawed and unsustainable approach (the more migrations 
# you'll amass, the slower it'll run and the greater likelihood for issues). 

我想知道的是,這會如何影響生產服務器上的遷移?例如,如果我按以下順序執行:

  1. 在新的生產服務器上運行db:schema:load
  2. 在開發中更改我的模式並推送到生產。生產服務器

  • 運行db:migrate會發生什麼?是否知道僅使用比db:schema:load動作更新的遷移,還是會嘗試全部運行它們?

  • +0

    而且你沒有想過簡單地運行這些幾個命令來檢查自己嗎? –

    +0

    @MichaelSzyndel - 誰說我沒有想過? – Yarin

    +0

    你的問題建議如此。如果你確實看到了它應該可以正常工作(只要遷移數據庫表在'schema:load'中填充,我並沒有檢查過它) –

    回答

    1

    好問題。答案是隻有在最新的db:schema:load事件之後創建的遷移纔會運行。

    schema.rb文件都有一個與之關聯的版本戳:

    ActiveRecord::Schema.define(version: 20130928225041) do ... 
    

    當您運行db:schema:load,Rails的根據是schema.rb文件創建一個新的數據庫,並在同一時間填充schema_migrations表中的所有遷移的版本號都在架構的版本號之前。

    所以,據我所知,Rails實質上是僞裝了所有的遷移,直到這一點,但實際上並沒有運行它們。 (我通過生成一個空的遷移文件,在本地調用db:migrate進行測試,然後在將錯誤部署到我們的服務器之前將錯誤插入到遷移文件中。在服務器上,我們運行db:schema:load,結果是包含錯誤遷移在schema_migrations表中就好像它已經運行一樣,儘管它顯然沒有。)