【问题标题】:I fixed a failing rails migration, but why did this fix work?我修复了失败的 Rails 迁移,但为什么这个修复有效?
【发布时间】:2012-11-08 14:50:55
【问题描述】:

我生成了一个新的 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

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

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案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
    

    希望这会有所帮助。

    【讨论】:

    • 这准确地解释了我的迁移失败的原因以及将来如何修复它(不要在迁移已经运行后弄乱),但是您能否更具体地说明为什么要重新创建数据库解决了这个问题?
    • 您需要进行“删除”的唯一原因是您的迁移不同步——它们通常被编辑并且与现实不符。我通常会尝试修复迁移,有时会暂时删除部分,回滚,然后再添加部分。这样我就不必从头开始,也不会丢失所有数据。
    • 有没有办法查看过去迁移的列表及其详细信息?
    • 所有迁移:app/db/migrations
    • 如果您想查看已运行的迁移,最新的迁移列在 db/schema.rb 文件的第一行。 “ActiveRecord::Schema.define(:version => 20121106221959)”。因此,该版本是您运行的最后一次迁移,因此只需对任何 PRIOR 迁移进行仔细更改。以后的任何迁移,您都可以根据需要进行更改。
    【解决方案2】:

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

    你可能搞砸了迁移。

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

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

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

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

    【讨论】:

    • ^^ 查看我对卡森回答的评论。
    猜你喜欢
    • 2018-07-09
    • 2021-01-20
    • 2012-04-05
    • 1970-01-01
    • 2021-04-11
    • 2016-09-18
    • 1970-01-01
    • 2021-10-05
    • 2012-01-12
    相关资源
    最近更新 更多