2013-04-24 103 views

回答

111

虽然@Orlandos的回答是正确的,但rake db:reset不会重做所有的迁移,并且正如他所说,加载最后一个模式的数据。 如果要撤消所有的迁移,然后重做,你应该使用:

rake db:migrate:reset #runs db:drop db:create db:migrate 

您可以在这个帖子详细信息请参阅:Difference between rake db:migrate db:reset and db:schema:load

+8

这是真正正确的答案 – 2014-04-02 08:11:31

+3

应该选择这个答案以避免混淆。 – 2015-01-10 03:17:11

+0

'rake db:migrate:reset'实际上并没有回滚任何迁移,这就是问题所在。 – 2015-08-27 14:59:37

14

只是使用rake db:reset,这将删除您的数据库(与撤消所有迁移相同)并重置为最后一个模式。

UPDATE:更正确的方法将使用rake db:migrate:reset。这将删除数据库,再次创建并运行所有迁移,而不是重置为最新的模式。

+8

这不是问题想要做的。如果您在迁移中更改某些内容,它将不会更新架构中的更改。 – 2015-07-08 10:43:10

+0

@Alex Falke对这个问题得到了正确的答案。 – Qasim 2016-11-26 04:43:21

+0

@ Qasim答案更新:) – Orlando 2016-11-27 00:03:22

16

如果你真的想回滚所有的迁移,而不是仅仅把数据库恢复到原始状态或最后的模式,你必须运行:

rake db:migrate VERSION=0 

这实际上将回滚一路下来每个迁移和ensu因为每一次迁移都是可逆的。

如果你现在发出

rake db:migrate:status 

你会看到,所有的迁移仍然存在,但他们是在“向下”(不适用)状态。

其他指令暗示rake db:resetrake db:drop(例如@Orlando或@Alex Falke的答案)根本不会做任何回滚:也就是说,它们不会确保每次迁移都是可逆的。

而且,rake db:drop不能在数据库被其他用户访问时运行,而回滚可以实时执行(即使通常不建议这样做)。最后但并非最不重要的一点是,简单地删除并重新创建数据库也会删除模式迁移表:如果某人在数据库被删除后运行rake db:migrate:status,他将回答“模式迁移表尚不存在”,并且将没有线索关于哪些迁移可以应用(除非他知道它或可以列出它们)。