2013-07-18 185 views
3

我不明白爲什麼會發生這種情況。我有以下遷移:Rake db:遷移表已經存在

def self.up 
    create_table :leakages do |t| 
    t.integer :feature_id 
    t.integer :project_id 
    t.float :total 
    t.date :apt_date 
    end 
    add_index :leakages, [:feature_id, :apt_date] 
end 

當我運行它正常運行的第一次,但是當我再次運行遷移,然後被拋出話說leakages表的錯誤已經存在。爲什麼會發生此錯誤?我正在使用mysql2寶石。

+1

你爲什麼要運行遷移不止一次? – zeantsoi

+0

您是否使用Rails生成器創建了遷移?您的遷移文件是否有任何時間戳前綴? – abhidsm

+0

要添加其他表 – user2406618

回答

2

您的leakages遷移中是否有相應的self.down?如果沒有,那麼你可以改變方法到def change,那麼你應該能夠運行rake db:migrate:redo,它運行db:migrate:down然後db:migrate:up爲您的最後一次遷移。

您看到該消息的原因是因爲該表已存在。 rake db:migrate不會刪除表格。基本上,它針對當前環境運行尚未運行的遷移。

您可能也有興趣閱讀:http://guides.rubyonrails.org/migrations.html#running-specific-migrations

所以要重新運行遷移(即DB:遷移:向下則db:遷移:上),你可以運行:

rake db:migrate:reset VERSION={your migration version} 
+0

我有一個相應的self.down方法在我的遷移文件 drop_table:泄漏 是的,但我添加刪除索引self.down方法因爲drop table會自動刪除所有的索引。 – user2406618

+0

我們的數據庫團隊直接從mysql數據庫中更改了泄漏表,這就是耙子沒有成功完成的原因。現在我們糾正它。謝謝 – user2406618

-1

加入這行代碼在現有的文件並重新做耙分貝:遷移

def down 
     drop_table :leakages 
    end 

這是因爲您已經創建了泄漏表並將其遷移。再次,你要創建它,所以首先他們不應該是泄漏表。那麼只有它可以創建它。因此,在創建另一個表之前,必須先刪除泄漏表。

3

您需要刪除該表從SQL精簡版控制檯(你會失去其中包含的所有數據)

1)訪問SQL精簡版控制檯,輸入端子

sqlite3 db/development.sqlite3 

2)刪除表(不要忘記最後;)

drop table table_name; 

3)退出SQL精簡版控制檯

.quit 

4)運行分貝:遷移再次

bin/rake db:migrate 

希望它能幫助,它爲我工作

+1

如果您的遷移顯示爲「向下」,但表中存在您的數據庫,則這是唯一的解決方案。如果您切換了分支機構,則無法通過適當的遷移進行重置,因爲您無法「首先」下移遷移(因爲它被視爲「上」) – xHocquet