簡體   English   中英

為什么在向表中添加新列時不再能耙db:migrate了? 我可以在遷移文件中手動添加列還是應該生成一個?

[英]Why can I no longer rake db:migrate when adding new columns to my table? Can I add columns manually in the migration file or should I generate one?

大家早上好,我正在嘗試從Codeacademy完成日歷應用程序,我需要完成以下步驟。

在db / migrate /中為days表打開遷移文件,然后添加以下列:

  • 日期時間列,稱為日期

在db / migrate /中為days表打開遷移文件,並添加以下列:一個名為date的datetime列在db / migrate /中為事件跟蹤表打開遷移文件,並添加以下列:

  1. 名為name的字符串列
  2. 從中調用的日期時間列
  3. 日期時間列稱為
  4. 稱為位置的字符串列
  5. Day模型的參考列

到目前為止,我已經將其手動添加到了遷移文件中,如下所示:

class CreateDays < ActiveRecord::Migration
  def change
    create_table :days do |t|
      t.datetime :date
      t.timestamps
    end
  end
end

class CreateEvents < ActiveRecord::Migration
  def change
    create_table :events do |t|
      t.string :name
      t.datetime :from 
      t.datetime :to 
      t.string :location 
      t.timestamps
      #Not sure how to add references column????
    end
  end
end

但是,當我運行rake db:migrate時遇到錯誤,但是沒有任何輸出。 是否應該有輸出? 我已經運行rake db:migrate --trace,這是輸出:

遷移文件就像一個腳本 ,它以某種方式更改數據庫。 它不存儲數據庫的狀態。

除非您運行它,否則它不會做任何事情:數據庫具有一個特殊的表,用於跟蹤已運行的表,稱為schema_migrations 根據該表,在執行rake db:migrate運行該文件夾中尚未運行的所有腳本。

因此,如果您運行一個腳本,然后對其進行更改,然后再執行db:migrate,它將不會再次運行它,因為它認為它已經運行了。 如果沒有再次運行它,它可能會炸掉,因為它會嘗試添加大量已經存在的列。

如果您在遷移中定義了一個表,然后又想添加更多列,則可以回滾遷移(這將刪除該表),然后使用添加的列再次運行它,或者編寫一個新遷移,僅添加需要新的列。 后一種方法通常是最好的。

我假設您之前已經進行過遷移。 因此,存在一個名為schema_migrations的表,其中存儲了已經運行的遷移,因此您無法重新運行它們。 將新列添加到現有表的最佳方法是創建一個新的遷移,如下所示:

rails g migration add_some_columns_to_events name:string

並命名其他列。 仍然,如果您需要使用現有的遷移來做到這一點,那么您可以做的是:

rake db:migrate:down VERSION=<version_of_migration>

然后將遷移文件中的列加起來並運行:

rake db:migrate:up VERSION=<version_of_migration>

您還可以回滾上一次遷移並使用以下命令重新運行遷移:

rake db:rollback

希望這可以幫助。

您只能運行一次遷移-如果您已經運行了遷移,則有兩個選擇:

  • 您可以回滾與遷移rake db:rollback ,編輯它,然后再次運行rake db:migrate ,或
  • 您可以生成一個新的遷移並將所做的更改放入其中。 然后,您可以使用rake db:migrate運行新rake db:migrate

每當您運行rake db:migrate時,它將使用每個遷移文件具有..的時間戳(例如YYYYMMDDHHMMSS_create_products.rb.運行所有待處理的遷移YYYYMMDDHHMMSS_create_products.rb.

rake db:migrate期間,將拾取任何具有比以前運行的遷移時間戳大的rake db:migrate ,然后檢查rake db:migrate是否存在更改。 例如:對於遷移文件20080906120001_add_details_to_products.rb ...如果已運行,則所有更改將添加到數據庫中。如果對其進行編輯然后再次運行,則不會將其作為遷移時間戳記應該比以前運行的文件要好一些,而不是。 您可以通過編輯一些數字來手動更改遷移,以便再次拾取它而無需創建新文件。

我建議創建一個新的,因為它們是維護方式,並且每個遷移都應該是唯一的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM