如何在Rails 3中删除迁移文件


109

我想删除/删除迁移文件。我将如何去做?我知道这里也有类似的问题,但作为更新,是否有比脚本/销毁更好的方法?

另外,我应该做一个,db:reset还是db:drop如果我删除/删除一个迁移?

Answers:


142

我通常:

  1. rake db:migrate VERSION=XXX在所有环境中执行一个,直到我要删除的版本之前的版本。
  2. 手动删除迁移文件。
  3. 如果有待处理的迁移(即,我删除的迁移不是最后一个迁移),则只需rake db:migrate重新执行一次即可。

如果您的应用程序已经在生产或暂存中,那么编写另一个破坏表或列的迁移会更安全。

关于迁移的另一个很好的参考是:http : //guides.rubyonrails.org/migrations.html


2
是否要删除迁移,然后运行db:migrate清除创建的表?
alvincrespo

2
不,因为Rails不知道如何删除它。它需要调用在self.down迁移中定义的方法来“降级”数据库。
法比奥·巴蒂斯塔

35
如果您已经删除了文件,而没有意识到Rails不会轻易放手,rake db:migrate:status则会向您显示丢失文件的ID,您可以使用该ID来重新创建它。回来后,您可以按照此答案的建议取胜。
乔丹·费尔德斯坦,

1
@JordanFeldstein,谢谢。db:migrate:status是救生员!

1
@Lucas,删除迁移文件后,将无法再撤消它。因此,在删除文件之前,必须在它已经运行的所有环境(生产,开发,测试,暂存等)上还原它。这就是为什么我写道,一旦已经在生产环境中运行,创建另一个迁移来还原旧的迁移就更安全了。
法比奥·巴蒂斯塔

68

删除迁移的另一种方法:

$ rails d migration SameMigrationNameAsUsedToGenerate

rake db:migrate执行之前使用它,因为数据库中的更改将永久保留:)-或手动删除更改


3
“如果您的应用程序已经在生产或暂存中,那么编写另一个破坏表或列的迁移会更安全。” 因此,更改不会永远保留在数据库中
JohnMerlino13年

8
顺便说一句,“ d”代表“毁灭”。
Greg M. Krsak 2014年

21

在应用主目录下运行以下命令:

  1. rake db:migrate:down VERSION="20140311142212" (此处的版本是创建迁移时由rails加上的时间戳。此操作将还原由于此迁移而导致的数据库更改)

  2. Run "rails destroy migration migration_name"(migration_name是创建迁移时选择的一种用途。从迁移文件名中删除“ timestamp_ ”即可获取)


耙销毁迁移AddFileToTable耙中止!不知道如何构建任务“破坏”(通过使用--trace运行任务来查看完整跟踪)
sadaf2605

3
对于#2,正确的命令是:rails d migration migration_name
mauriciomdea 2015年

1
感谢您所需要的“删除timestamp_”提示
LightMan

10

您也可以像这样进行向下迁移:

rake db:migrate:down VERSION=versionnumber

有关更多信息,请参阅Ruby on Rails迁移指南


9

我们可以用,

$ rails d migration table_name  

这将删除迁移。


1
我认为应该是模型名称而不是table_name
Ajeet Khan

3

有时我发现自己删除了迁移文件,然后从数据库中删除了表schema_migrations上的相应条目。不漂亮,但有效。


3

这也适用于Rails 5。

如果迁移是最新的,则可以通过执行以下操作删除迁移添加的数据库列:

rake db:rollback

然后运行以下命令删除迁移文件本身:

rails d migration WhateverYourMigrationWasNamed.rb 


1

这些答案都不适合我所要解决的问题,因为我想删除的迁移丢失了:我在其他分支中创建并运行了迁移,然后将其丢弃。问题是运行迁移时,rails将版本添加到schema_migrations数据库的表中。因此,即使未在您的数据库结构或架构中列出它,Rails也会寻找它。您可以通过运行以下操作来显示这些孤立的迁移:

rails db:migrate:status

请注意缺少的迁移的版本,并进入db控制台:

rails dbconsole

现在,从迁移表中手动删除版本:

delete from schema_migrations where version='<version>';

您现在应该很好。


0

我只是有同样的问题:

  1. rails d migration fuu-此操作 删除了上一个时间戳的迁移
  2. rails d migration fuu-此 删除了其他迁移
  3. 使用git status来检查不在未跟踪的文件上
  4. Rails G迁移功能

这为我解决了


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.