从控制台输出重新填充意外删除的heroku数据库

时间:2011-03-07 04:17:38

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

我犯了一个错误,意外删除了生产中附件模型中的所有记录。

我至少可以从控制台输出中获取所有记录(我以前做过一个简单的Attachment.all并获取屏幕上显示的所有记录)。

这是实际输出的样本:

=> [#<Attachment id: 50, shortcut: "1eo2", attachment_file_name: "tumblr_lbxifqK2LT1qa0qyy.jpg", attachment_content_type: "image/jpeg", attachment_file_size: 80960, attachment_updated_at: "2010-12-22 07:39:01", created_at: "2010-12-22 07:39:02", updated_at: "2011-03-07 02:14:05", post_id: nil, about_me: nil, is_nsfw: nil, attachable_id: nil, attachable_type: nil, is_default: nil, temp_token: nil, user_id: 1, description: nil, visits: nil>, 
#<Attachment id: 51, shortcut: "1fp7", attachment_file_name: "tumblr_lbxig3Qzrg1qa0qyy.jpg", attachment_content_type: "image/jpeg", attachment_file_size: 75532, attachment_updated_at: "2010-12-22 08:04:00", created_at: "2010-12-22 08:04:01", updated_at: "2011-03-07 02:14:05", post_id: nil, about_me: nil, is_nsfw: nil, attachable_id: nil, attachable_type: nil, is_default: nil, temp_token: nil, user_id: 1, description: nil, visits: nil>, 
#<Attachment id: 52, shortcut: "1ghq", attachment_file_name: "tumblr_lbh5dvOZMf1qa4bk9o1_500.jpg", attachment_content_type: "image/jpeg", attachment_file_size: 68396, attachment_updated_at: "2010-12-22 08:04:32", created_at: "2010-12-22 08:04:33", updated_at: "2011-03-07 02:14:05", post_id: nil, about_me: nil, is_nsfw: nil, attachable_id: nil, attachable_type: nil, is_default: nil, temp_token: nil, user_id: 1, description: nil, visits: nil>,

问题是我如何解析这个日志再次把它们放到数据库中,还有一种方法可以保留原始ID并避免使用新的ID? (我通过ID与其他模特获得了其他关系)。

2 个答案:

答案 0 :(得分:0)

您可能能够做到的快速而肮脏的方式与此类似:

1)将所有控制台输入加载到字符串中。取下开头/结尾的方括号(方形的)。然后,使用此Regex获取每个Attachment对象的内容:

#<Attachment (.*)>,

所以,像

consolestr.scan(/#<(Attachment .*)>,/).each do |attachment|

它应该为您提供一个由每个Attachment对象组成的数组。

2)在逗号上拆分每个Attachment对象的属性以获取完整属性,然后在冒号上获取键值对。类似的东西:

properties = {}
attachment.split(",").each do |property|
    s = property.split(":")
    key = s[0]
    value = s[1]
    properties[key] = value
end

3)重新创建记录:

Attachment.create(properties)

不幸的是,我现在不在一个可以完全测试它的地方,但我认为它应该在理论上起作用。您可能需要对捕获的value进行一些额外的修改,例如删除字符串值的引号。希望这至少有一种方法可以让您开始恢复该数据。我相信你现在非常神经紧张!

答案 1 :(得分:0)

如果您正在尝试将数据库恢复到确定它之前的确切位置,那么最好的选择是获取控制台输出并将其转换为原始SQL INSERT语句。

通过Rails控制台创建对象将重新分配ID字段,这将破坏您已有的任何现有对象关联。