Rails:如何回滚拙劣的迁移

时间:2011-08-10 22:00:50

标签: ruby-on-rails ruby-on-rails-3 rollback rails-migrations

我是个白痴......搞砸了Rails中的迁移:

认为迁移会像模型生成器一样工作(使用references:modelname)我执行了以下操作:

$ rails g migration add_event_to_photos references:event

创建了迁移

class AddEventToPhotos < ActiveRecord::Migration
  def change
    add_column :photos, :references, :event
  end
end

现在我的开发数据库( SQLite3 )在references表格中有一个eventphotos列。

我的schema.rb中间有一行说:

# Could not dump table "photos" because of following StandardError
#   Unknown type 'event' for column 'references'

rake db:rollback无能为力:

$ rake db:rollback
==  AddEventToPhotos: reverting ===============================================
-- remove_column("photos", :references)
rake aborted!
An error has occurred, this and all later migrations canceled:

undefined method `to_sym' for nil:NilClass

那么,如何在数据库中回滚并维护我的开发数据?如果那是我唯一的选择,我甚至会很高兴丢弃照片表。但是不想重建整个事情。怎么办?


btw-对于任何读这篇文章的人都要犯同样的愚蠢错误......不要!使用正确的迁移生成器:

$ rails g migration add_event_to_photos event_id:integer

5 个答案:

答案 0 :(得分:6)

我发现这样做的最简单方法是在/db/中的schema.rb文件中重新创建表。之后我运行了rake db:reset(如果它说您有待定迁移,只需删除它们然后重试)。

这解决了这个问题。

答案 1 :(得分:3)

通过./script/rails dbconsole进入数据库。然后输入以下命令:

.output dump.sql
.dump

在文件dump.sql中,您将拥有用于重新创建和填充数据库的SQL命令。只需使用您喜欢的编辑器(如vim ;-)删除或修复列类型即可对其进行编辑。您还可以从schema_migrations表中删除无效的迁移标识符。删除数据库(我建议只重命名db/development.sqlite文件),创建新数据库并将转储文件读入其中(使用命令.read dump.sql)。

现在您只需要修复并运行迁移。

答案 2 :(得分:2)

添加一个空的down方法并运行rake db:rollback

编辑啊,这是新的迁移语法,您可以简单地替换正文:

def self.down; end

这是旧语法,或者可能完全删除正文(尚未尝试过)然后运行rake db:rollback

答案 3 :(得分:0)

只是一个想法,我知道不是SQLite特定的,你可以恢复到旧的版本模式,加载它。从那里再试一次?您可以在GIT中还原(签出)特定文件。然后按照另一张海报的建议做def self.down; end

答案 4 :(得分:0)

问题出现了,因为SQLite将使用您提供的任何类型创建模式(在这种情况下为event,它不能将该类型转储回ActiveRecord。

您需要编辑sqlite_master文件并更改create table string(sql)才是正确的。

你可能想先备份你的桌子,因为搞错了这个字符串会破坏你的桌子,如果你做错了。

Here is a related rails issue