Ruby on rails 如何在不删除所有较新迁移的情况下再次运行迁移?
我刚刚安装了Desive,所以表中除了一个用户(我)之外没有任何数据 我又重新做了一遍数据库,所以我把它全丢了。我做了Ruby on rails 如何在不删除所有较新迁移的情况下再次运行迁移?,ruby-on-rails,ruby,devise,rake,Ruby On Rails,Ruby,Devise,Rake,我刚刚安装了Desive,所以表中除了一个用户(我)之外没有任何数据 我又重新做了一遍数据库,所以我把它全丢了。我做了railsgscaffold来生成6个新的模型和控制器,并做了rakedb:migrate 在我的/db/migrate目录中,我有文件名为20130603211907\u designe\u create\u users.rb的designe文件 问题是:如果我做了rake db:migrate:down VERSION=20130603211907它将删除所有新的迁移 如何在
railsgscaffold
来生成6个新的模型和控制器,并做了rakedb:migrate
在我的/db/migrate
目录中,我有文件名为20130603211907\u designe\u create\u users.rb的designe文件
问题是:如果我做了rake db:migrate:down VERSION=20130603211907
它将删除所有新的迁移
如何在不删除所有较新的迁移的情况下再次运行迁移?它将先运行向下步骤,然后运行向上步骤(此命令可以删除您的表!):
rakedb:migrate:redo VERSION=xxxxxxx
为了防止表被删除,您可以结合暂时注释下步骤。如果您是在本地开发的,并且从模型中删除所有数据不会造成伤害,您只需删除数据库,然后创建&迁移划痕:
这将把所有文件迁移到版本=20090408054532
结账谢谢大家的帮助。这就是我的工作原理:
警告:这些命令将删除数据库中的所有数据强>
rake db:drop
rake db:create
rake db:migrate
您可以调用rake db:migrate:redo VERSION=20130603211907
,它将重新运行指定的版本。
此外,如果您有只应在迁移链上运行的迁移(例如,数据转换、复制等),则可以指定
def up
do_something
end
和def down(下降)、def change(双向)方法
要临时禁用迁移,只需将方法def up
重命名为def up
,它将在处理迁移链时被忽略。在更改迁移的时间戳后,我将尝试rake db:migrate
,看看会发生什么。哈哈,我也这么做了。我在DEV,没有人支付我的产品,所以我不会推荐任何其他方式。考虑接受对你工作的答案,而不是在你自己的答案中第二次包括解决方案;我只做了railsdb:migrate
,它没有删除我的数据库:)只是为了更新。这比OP要求的要多得多。这是在没有任何种子数据的情况下重置数据库。基本上从零开始运行迁移。如果没有数据库备份或在生产环境中,您可能永远都不想这样做。另请查看以获得版本列表:rake db:migrate:status
。现在是rails db:migrate:status
,如果您使用的是rails 5+,当迁移无法轻松回滚时,这也很好,比如change\u列
。我认为db:reset与drop、create、migrate相同,但不是。单独执行这些步骤对我很有效,并在本地纯开发人员的绿地应用程序上重新运行我修改过的迁移。这不是正确答案,与OP要求的结果有很大不同。但请注意,如果迁移已经运行,则此操作会无提示地失败。我能看到的唯一方法是在不运行向下迁移的情况下重新向上执行up
,即注释掉所有内容,db:migrate:down
,再次取消注释,然后按所述执行db:migrate:up
。
def up
do_something
end