2013-07-18 140 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