Rails:如何删除一个挂起的迁移

27

我目前正在按照ruby on rails教程进行学习:http://guides.rubyonrails.org/getting_started.html

我试图将数据保存到数据库中。但是,当我运行rails server时,我会得到以下错误:

Migrations are pending. To resolve this issue, run: bin/rake db:migrate RAILS_ENV=development

我查看了其他的文章,当我运行以下命令时:

bin/rake db:migrate 

我遇到了一个rake aborted!的错误。

在运行以下命令后出现:

rake db:abort_if_pending_migrations....

我看到:

You have 1 pending migration:
20150805200129 CreateDatabases

SQLite3::SQLException: table "databases" already exists:

它只告诉我运行rake db:migrate重新开始。

看起来它已经存在了。有没有取消待处理迁移的方法?


您的待迁移内容正在尝试创建“databases”表,但该表已经存在... - Igor Belo
6个回答

44
有时,即使是删除本地开发数据库也不是一个好主意。在Rails应用程序中,有更好的方法来删除/销毁特定的迁移。你可以使用rails d migration命令来销毁特定的迁移:
rails d migration MigrationName

要撤销特定迁移对应的更改,可以像这样使用db:migrate:down 方法:

rake db:migrate:down VERSION=XXX
有时候情况会变得更加混乱,在这种情况下,另一个方便的方法是查看数据库中的schema_migrations表,其中保存了所有迁移及其版本。您可以通过以下方式从此表中删除特定的迁移:
delete from schema_migrations WHERE version = VERSION;

如果您不想再保留该迁移,请使用本方法。


值得一提的是,通过使用适当的带有DDL事务的RDBMS(如Postgres),完全可以避免这个问题。 - EugZol

17

您的迁移可能在中途失败了(因此它创建了表,但没有完成)。

您只是在使用开发环境,所以可以放心地删除数据库并从头开始重建:

rake db:drop # THIS WILL DELETE YOUR DATABASE
rake db:create
rake db:migrate

11
我认为假设删除开发数据库没关系是很危险的。我见过一些开发数据库需要花费相当长的时间来恢复。 - spickermann
恢复它有什么难的?如果您有一些不再起作用的旧迁移,可以使用rake db:schema:load而不是db:migrate - EugZol
成功了!感谢您的见解!@spickermann,你是对的,幸运的是,它可以在几秒钟内被替换,因为这只是入门级别的东西。 - Leslie Tate
1
其实我介意!因为我在发布我的答案之前/之中已经做过了,我不能再做第二次 :D - EugZol
1
@KennyEllis 恭喜您的声望提升并感谢您的点赞! :) - EugZol

3
如果你和我一样,将数据库结构保存在Rails之外,你可以直接删除db/migration中的迁移文件。当我使用rails generate命令创建模型类时,忘记了它还会创建一个迁移文件,导致出现了OP问题中的错误。
如果你依赖Rails来维护数据库结构,请不要使用此方法!
我通过以下方式使我的Rails结构文件与数据库同步更新:
bundle exec rake db:structure:dump

1
我不建议删除数据库并从头开始,特别是当您已经有了数据库中的数据时。
我的方法是先进行迁移,然后回滚。之后,您可以安全地删除迁移文件。因此,该过程如下所示。
rails db:migrate
rails db rollback
rm db/migrate/your_last_migration_file.rb

只有当迁移具有适当的“down”方法时才能正常工作。 - svelandiag

0

你可以使用以下命令在开发环境中重新创建数据库并运行所有迁移:

rails db:migrate:reset

-3
如果您想要撤销错误的迁移,可以使用以下命令删除整个数据库:
rake db:drop

然后手动删除迁移文件(这不会在重新创建时破坏数据库,因为模式迁移也将被删除)。

然后运行

rake db:migrate

如果有数据需要种植,那么也要运行这个。
rake db:setup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接