如何在不删除所有较新的迁移的情况下再次运行迁移?

Kus*_*ush 18 ruby rake ruby-on-rails devise

我刚刚安装了设备,所以除了一个用户(我)之外,表上没有任何数据.

我再次重新做数据库所以我放弃了所有.我做rails g scaffold了6个新的模型和控制器,并做了rake db:migrate

在我的/db/migrate目录中,我有一个带文件名的devise文件20130603211907_devise_create_users.rb

问题出在这里:如果我这样做rake db:migrate:down VERSION=20130603211907,将删除所有新的迁移.

如何在不删除所有较新的迁移的情况下再次运行迁移?

Sac*_*n R 57

rake db:migrate:redo VERSION=xxxxxxx

它将运行向下然后向上运行.您可以结合暂时注释掉向下步骤来执行此操作.

  • 要获取版本列表,请执行以下操作:`rake db:migrate:status`. (17认同)
  • 现在是 `rails db:migrate:status`(如果您使用的是 Rails 5+) (4认同)

dav*_*son 8

如果在本地发展,它不会伤害到从模型中删除所有数据,你可以简单地drop你的数据库,然后createmigrate从头开始:

清除或重新创建Ruby on Rails数据库

  • 这不是正确的答案,并且与 OP 要求的答案截然不同。 (3认同)

Kus*_*ush 8

感谢大家的帮助.这对我有用:

警告:这些命令将删除数据库中的所有数据!

rake db:drop
rake db:create
rake db:migrate
Run Code Online (Sandbox Code Playgroud)

  • 考虑接受对你有用的答案,而不是在你自己的答案中第二次包括解决方案;) (3认同)

wol*_*tob 6

您可以致电rake db:migrate:redo VERSION=20130603211907来重新运行指定的版本。

另外,如果您的迁移仅在迁移链向上时才运行(例如,数据转换,复制等),则可以指定一个

def up 
  do_something
end
Run Code Online (Sandbox Code Playgroud)

和def down(下降),def改变(双向)方法。

例如,要暂时禁用迁移,只需将方法重命名def updef up_,在处理迁移链时它将被忽略。


bun*_*nty 5

rake db:migrate:up VERSION=20090408054532
Run Code Online (Sandbox Code Playgroud)

这会将所有文件迁移到VERSION = 20090408054532

签出运行单个迁移文件

  • 请注意,如果迁移已经运行,则此操作将无法执行任何操作。我能看到在不事先运行向下迁移的情况下重新“up”的唯一方法是注释掉所有内容,“db:migrate:down”,再次取消注释,然后按照描述的“db:migrate:up”。 (2认同)