2

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

rails generate migration some_new_column_to_table

编辑: ——

运行迁移:

rake db:migrate

更新的测试数据库:

rake db:test:prepare

意识到我没有在更改方法中添加任何内容,然后

更新了迁移文件:

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

为什么这解决了问题?以后如何预防?

4

2 回答 2

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

希望这会有所帮助。

于 2012-11-08T15:25:35.323 回答
0

我不能说这个问题是肯定的,但值得一试。

你可能搞砸了迁移。

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

例如,假设您创建了一个添加字段的迁移,就像您所做的那样。然后您意识到不再需要该字段,并将其从迁移中取出。

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

因此,在使用迁移时,尽量不要编辑旧的迁移。总是创造新的。

于 2012-11-08T15:31:54.307 回答