【发布时间】: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”和完全相同的字段创建迁移,即错误的字段。再次尝试回滚。然后删除迁移,迁移新的
-
您还可以回滚当前迁移并生成新迁移以更改列名称(stackoverflow.com/a/1992045/4650675)。