Rails 5:为什么Rails为什么将列添加到schema.rb,即使我已经删除了迁移文件

时间:2018-10-25 09:41:25

标签: ruby-on-rails postgresql

我创建了一个迁移:

class AddFormCounterToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :form_count, :integer, default: 0
  end
end

我运行了rails db:migrate,但很快意识到我没有正确地重命名该列。所以我运行了git reset master --hard-以便删除迁移文件,并重置了schema.rb-并再次开始:

class AddFormCounterToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :forms_count, :integer, default: 0
  end
end

但是这次我运行rails db:migrate时,不仅创建了新列,还创建了旧列。

  t.integer "form_count", default: 0
  t.integer "forms_count", default: 0

哦?因此,我运行rails db:rollback以查看是否可行。但这失败并显示以下错误:No migration with version number 20181025092233.由于我尚未提交该文件,因此我相信没有恢复它的方法。

此迁移在何处以及为何持续存在?在决定删除并重做迁移时的最佳实践是什么?摆脱泡菜的最好方法是什么?除了运行rails db:reset之外,还有其他方法吗? (我正在使用Postgres。)

2 个答案:

答案 0 :(得分:1)

我认为您在这里有两种解决方案。 您可以重新创建完全销毁的迁移文件(带有正确的时间戳),然后可以从此处rails db:rollback回滚并删除它。模式将被相应破坏。

另一种解决方案:rails将已完成的所有迁移保存在名为schema_migrations的数据库表中。迁移数据库时,在schema_migrations中创建了相应的条目。通过在主服务器上重置来删除迁移文件时,您并未在表中删除该条目。因此,您可以这样做:

rails dbconsole

一次在控制台中

SELECT * FROM schema_migrations;

您还将看到在数据库上进行的迁移的所有时间戳记,您还以为已删除的时间戳记也在此处。复制时间戳,然后:

DELETE FROM schema_migrations WHERE version=$yourtimestamp;

退出数据库控制台并重置数据库

答案 1 :(得分:1)

首先,进行数据库备份。然后,删除数据库(rake db:drop,然后删除schema.rb,然后开始清理项目

rake db:schema:cache:clear
rake db:schema:cache:dump

最后再次创建数据库

rake db:create
rake db:migrate

大多数时候,只需删除“ schema.rb”即可避免这种错误。始终通过控制台rails命令维护项目组织。离开Git来控制应用程序的版本。