【问题标题】:rollback failed for rails migrationRails 迁移回滚失败
【发布时间】:2011-10-31 13:48:37
【问题描述】:

我在编辑 rails 迁移时犯了一个错误(我使用的是 rails 3.1.0rc5)。所以我纠正了它并尝试做一个rake db:rollback,然后是一个rake db:migrate db:test:prepare。但是由于某种原因回滚失败了。这是迁移的回滚部分:

  def down
    drop_table :assets
  end

这是db:rollback的回复:

==  CreateAssets: reverting ===================================================
rake aborted!
An error has occurred, this and all later migrations canceled:

ActiveRecord::IrreversibleMigration

Tasks: TOP => db:rollback
(See full trace by running task with --trace)

所以我只是手动删除了数据库中的 assets 表(我只是使用 sqlite3 dbs),注释掉 drop_table :assets 行并再次运行 db:rollback

==  CreateAssets: reverting ===================================================
-- drop_table("assets")
rake aborted!
An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: no such table: assets: DROP TABLE "assets"

Tasks: TOP => db:rollback
(See full trace by running task with --trace)

为什么它试图删除资产表?我从迁移中注释掉了(实际上后来删除了)drop_table :assets 行。我什至做了一个grep -r assets 来查看rails 可能从哪里获取该drop 命令,但找不到任何东西。

所以我的问题是如何重新运行此迁移?我很好奇 rails 是从哪里得到这个 drop 命令的?

更新:事实证明,rails 3.1 在回滚时实际上并没有查看迁移类的down 方法!它查看change 方法的迁移命令并反转它们。这就是为什么rake db:rollback 在我删除了drop_table :assets 指令后仍试图删除资产表的原因!我如何解决这个问题是我将change 方法更改为旧的rails 3.0 样式up 方法。然后rails查看了down方法,我从中删除了drop_table命令,回滚成功。

【问题讨论】:

  • 有类似的情况(Rails 3.2),用“up”替换“change”也对我有用。

标签: ruby-on-rails ruby-on-rails-3 migration ruby-on-rails-3.1 rails-migrations


【解决方案1】:

迁移在最新的 Rails 中发生了相当大的变化,尤其是逆向迁移。
我认为http://shardul.wordpress.com/2012/01/25/reversible-migrations/ 会为您提供所需的信息和选项。

顺便说一句,我对 3.1 有很多问题。 rc 候选(例如 rc4、rc5)并且现在必须保持在 3.0.9 才能获得稳定的新应用。

【讨论】:

  • 那篇 edgerails 文章为我解决了这个问题!我会用结果更新我的问题。
猜你喜欢
  • 2010-10-15
  • 1970-01-01
  • 2018-10-31
  • 2021-01-20
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 2015-12-07
相关资源
最近更新 更多