15

我是个白痴……在 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

那么,如何回滚和维护我在数据库中的开发数据呢?如果这是我唯一的选择,我什至会很乐意破坏照片表……但不想重建整个东西。该怎么办?


顺便说一句-对于任何阅读本文的人都会犯同样的愚蠢错误……不要!使用正确的迁移生成器:

$ rails g migration add_event_to_photos event_id:integer
4

5 回答 5

6

我发现执行此操作的最简单方法是在 schema.rb 文件中重新创建表/db/。之后我运行了一个rake db:reset(如果它说你有待处理的迁移,只需删除它们并重试)。

这解决了这个问题。

于 2012-08-30T12:26:30.287 回答
3

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

.output dump.sql
.dump

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

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

于 2011-08-10T23:33:11.537 回答
2

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

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

def self.down; end

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

于 2011-08-10T22:16:57.383 回答
1

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

于 2011-12-23T03:37:23.900 回答
0

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

您需要编辑 sqlite_master 文件并将创建表字符串 ( sql) 更改为正确的。

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

这是一个相关的rails问题

于 2012-01-03T18:42:34.017 回答