我是个白痴......搞砸了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
表格中有一个event
类photos
列。
我的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
答案 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
)才是正确的。
你可能想先备份你的桌子,因为搞错了这个字符串会破坏你的桌子,如果你做错了。