Rails: 如何删除挂起的迁移

Rails: How to delete a pending migration

我目前正在关注 rails 教程中的 ruby: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:

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

好像已经存在了。有没有办法取消挂起的迁移?

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

您只是在使用开发环境,因此可以删除数据库并从头开始重建它:

rake db:drop
rake db:create
rake db:migrate

有时,甚至删除本地开发数据库也不是一个好主意。 delete/destroy 在您的 Rails 应用程序中进行特定迁移有更好的方法。

您可以使用 rails d migration 命令来销毁特定的迁移:

rails d migration MigrationName

要撤消与特定迁移对应的更改,您可以使用 db:migrate:down 方法,如下所示:

rake db:migrate:down VERSION=XXX

有时,事情可能会变得更加混乱,在这种情况下,另一件方便的事情是查看数据库中的 schema_migrations table,其中包含所有迁移及其 version 保存在里面。

您可以从这个 table 中删除特定迁移,如下所示:

delete from schema_migrations WHERE version = VERSION;

如果您不想再出现该迁移。

如果你想恢复错误的迁移,你可以使用这个删除整个数据库:

rake db:drop

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

然后运行

rake db:migrate

如果有数据要播种,那么运行这也是

rake db:setup

如果您像我一样在 Rails 之外维护您的数据库结构,您可以从 db/migration 中删除迁移文件。当我使用 rails generate 命令创建模型 class 时,我在 OP 的问题中遇到了错误,忘记了它还创建了一个迁移文件。

如果您依赖Rails维护您的数据库结构,请不要使用此方法!

我通过使用以下数据库从数据库构建我的 Rails 结构文件来保持最新:

bundle exec rake db:structure:dump

我不鼓励删除数据库并从头开始,尤其是当数据库中已有数据时。

我的做法是先迁移,再回滚。之后您可以安全地删除迁移文件。所以程序如下。

rails db:migrate
rails db rollback
rm db/migrate/your_last_migration_file.rb