2008-09-16 52 views
5

使用Rails/ActiveRecord的2.1.1rake db:migrate沒有檢測到新的遷移?經歷

  • 您創建第一個版本(例如)Ruby腳本\產生支架產品名稱:字符串描述:文本圖片網址:字符串
  • 此創建(例如)遷移文件名爲20080910122415_create_products.rb
  • 您應用與耙分貝遷移:遷移
  • 現在,您有一個字段添加到產品表Ruby腳本\產生遷移add_price_to_product價格:小數
  • 這創建一個名爲20080910125745_add_price_to_product.rb的遷移文件
  • 如果您嘗試運行rake db:migrate,它實際上會恢復第一次遷移,而不會應用下一次遷移!所以你的產品表會被破壞!
  • 但是,如果你獨自跑耙,它會告訴你一個遷移未決

請注意,在實施耙分貝:遷移(一旦表已被破壞)將適用於所有遷移秩序。

我發現的唯一的解決方法是指定新移民的版本爲:

rake db:migrate version=20080910125745 

所以我想知道:這是一個預期的新的行爲?

回答

1

您應該能夠使用

rake db:migrate:up 

,迫使它往前走,但你在你的團隊

如果您運行的風險與其他人失蹤交錯遷移

rake db:migrate 

兩次,它會重新應用您的所有遷移。

我在Windows上遇到與SQLite相同的行爲,它可能是特定於此類環境的錯誤。

編輯 - 我找到了原因。在鐵軌數據庫中。rake任務,你有下面的代碼:

desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x. Turn off output with VERBOSE=false." 
task :migrate => :environment do 
    ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true 
    ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil) 
    Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby 
end 
在我的環境變量

然後,我有

echo %Version% #=> V3.5.0f 
在Ruby中

ENV["VERSION"] # => V3.5.0f 
ENV["VERSION"].to_i #=>0 not nil ! 

因此耙任務調用

ActiveRecord::Migrator.migrate("db/migrate/", 0) 

並在主動記錄::遷移,我們有:

class Migrator#:nodoc: 
    class << self 
    def migrate(migrations_path, target_version = nil) 
     case 
     when target_version.nil?    then up(migrations_path, target_version) 
     when current_version > target_version then down(migrations_path, target_version) 
     else          up(migrations_path, target_version) 
     end 
    end 

是,rake db:migrate VERSION=0是長版rake db:migrate:down

編輯 - 我會去更新燈塔錯誤,但我在中超公司代理禁止,我連有

與此同時,您可能會嘗試在調用遷移之前取消設置版本...

0

這不是預期的行爲。我打算建議將此舉報告爲燈塔上的一個錯誤,但我看到你已經有already done so!如果你提供更多的信息(包括OS /數據庫/紅寶石版本),我會看看它。

1

我恭敬地不同意湯姆!這一個錯誤! V3.5.0f不是耙遷移的有效版本。 Rake不應該使用它來遷移:down只是因爲ruby選擇認爲「V3.5.0f」.to_i爲0 ...

Rake應該大聲抱怨VERSION無效,以至於用戶知道什麼是 (你和我之間,檢查版本是YYYYMMDD格式的時間戳通過轉換爲整數有點輕)

[該死的IE6,不會讓我評論!不,我不能改變瀏覽器感謝企業]

0

讓,

非常感謝您的調查。你是對的,實際上我認爲你已經發現了一個更嚴重的錯誤,即物種'設計缺陷'。

發生的事情是,rake會抓取你傳遞給命令行的任何值,並將它們存儲爲環境變量。最終被調用的rake任務將只從環境變量中提取這些值。 當db:遷移查詢ENV [「VERSION」]時,它實際上會請求您設置調用rake的版本參數。當你調用rake db:migrate時,你不會傳遞任何版本。

但是我們確實有一個名爲VERSION的環境變量,它已被其他程序設置爲其他用途(我現在還沒有)。 rake背後的人(或者在database.rake之後)還沒有想到會發生這種情況。這是一個設計錯誤。至少,他們可以使用更多特定的變量名稱,如「RAKE_VERSION」或「RAKE_PARAM_VERSION」而不是「VERSION」。

湯姆,我絕對不會關閉但編輯燈塔上的bug報告來反映這些新發現。

並再次感謝讓你的幫助。我已經將這個錯誤發佈在5天agao的燈塔上,但仍然沒有答案!

Rollo