[英]Ruby on Rails: How can I revert a migration with rake 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 /中為事件跟蹤表打開遷移文件,並添加以下列:
到目前為止,我已經將其手動添加到了遷移文件中,如下所示:
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.