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 upgrade 迁移条目从模式迁移表中删除后