Rails 5:为啥即使我删除了迁移文件,rails 也会向 schema.rb 添加列

Posted

技术标签:

【中文标题】Rails 5:为啥即使我删除了迁移文件,rails 也会向 schema.rb 添加列【英文标题】:Rails 5: Why does rails add column to schema.rb even though I've deleted the migration fileRails 5:为什么即使我删除了迁移文件,rails 也会向 schema.rb 添加列 【发布时间】:2019-03-29 21:09:18 【问题描述】:

我创建了一个迁移:

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。)

【问题讨论】:

这是因为,错误的迁移文件已经迁移到 db 并且在运行 rails db:rollback 之前您删除了旧版本。如果您不想重置数据库,请使用版本号“20181025092233”和完全相同的字段创建迁移,即错误的字段。再次尝试回滚。然后删除迁移,迁移新的 您还可以回滚当前迁移并生成新迁移以更改列名称(***.com/a/1992045/4650675)。 【参考方案1】:

我认为您在这里有两个解决方案。 您要么重新创建您销毁的确切迁移文件(使用正确的时间戳),然后您就可以从这里回滚 rails db:rollback 并将其删除。架构将被相应地销毁。

另一种解决方案:rails 将它完成的所有迁移保存在一个名为schema_migrations 的数据库表中。迁移数据库时,会在 schema_migrations 中创建相应条目。当您通过在 master 上重置来删除迁移文件时,您并没有删除表中的该条目。所以你可以这样做:

rails dbconsole

在控制台中一次

SELECT * FROM schema_migrations;

您将看到您在数据库上进行的迁移的所有时间戳,您认为已删除的那个也在这里。复制时间戳并:

DELETE FROM schema_migrations WHERE version=$yourtimestamp;

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

【讨论】:

错误消息中提到的迁移未在schema_migrations 中列出。最后,我完全放弃了数据库并重新开始。控制台的正确命令是rails dbconsole 很好的命令,我更新了答案。诚然,如果您不关心丢失内部数据,删除数据库也是一种解决方案【参考方案2】:

首先,做一个数据库备份。然后,下拉您的数据库(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 来控制您的应用程序的版本。

【讨论】:

以上是关于Rails 5:为啥即使我删除了迁移文件,rails 也会向 schema.rb 添加列的主要内容,如果未能解决你的问题,请参考以下文章

如何从现有迁移文件中删除脚本 rails

Rails DB 迁移 - 如何删除表?

在 rails upgrade 迁移条目从模式迁移表中删除后

为啥 jQuery 在我的 rails 5 应用程序中不起作用?

Rails 迁移:删除约束

为啥 datepicker 没有以 Rails 3 形式显示