我修复了一个失败的rails迁移,但为什么这个修复工作?

时间:2012-11-08 14:50:56

标签: ruby-on-rails ruby

我生成了一个新的rails迁移:

rails generate migration some_new_column_to_table

修改 -

运行迁移:

rake db:migrate

更新了测试数据库:

rake db:test:prepare

意识到我没有在change方法中添加任何东西,然后

更新了迁移文件:

class AddSomeColumnToTable < ActiveRecord::Migration
  def change
    add_column :table, :some_column, :string
    add_index :table, :some_column
  end
end

再次进行迁移:

rake db:migrate

更新测试数据库(再次):

rake db:test:prepare

运行这些命令后,“some_column”没有添加到数据库中。我在这里找到了解决这个问题的方法:rake db:migrate is not working

rake db:drop:all
rake db:create:all
rake db:migrate

为什么这样可以解决问题? 我怎么能在将来阻止它?

2 个答案:

答案 0 :(得分:1)

目前尚不清楚你的问题是什么。但是你的最后命令确实可以解决问题。

rake db:drop:all  << drop the database
rake db:create:all  << create the database (not the tables)
rake db:migrate << build up the database based on the migrations

根据我的经验,迁移不会“停止工作”而且它们完全按照布局进行,因为它们只不过是单独的命令。但是,它们要求按顺序执行它们,因此如果您开始编辑迁移,则必须知道迁移是否已运行。迁移问题通常是我们无序编辑它们的结果。最安全的最好方法是不要编辑已经运行的迁移。首先执行以下任何操作:

rake db:rollback  << rollback the last migration (you can do this multiple times)
rake db:migrate VERSION=00000   << This will rollback to a specific migration
rake db:rollback STEP=2 << rollback 2 migrations

希望这有用。

答案 1 :(得分:0)

我不能说问题确实存在,但值得一试。

您可能已经搞乱了迁移。

编辑迁移是不安全的,除非在任何计算机上都没有迁移过一次。

例如,假设你创建了一个像你一样添加字段的迁移。然后你意识到这个领域不再需要了,并把它带走了。

但是,如果您已经运行了迁移,它会将该字段留在您的数据库或您的案例中,它将不会添加该字段。

因此,在处理迁移时,请尝试不编辑较旧的迁移。永远创造新的。