我创建了一个迁移:
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。)
答案 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来控制应用程序的版本。