如何从转储创建数据库后跳过rails迁移

时间:2012-05-14 09:46:59

标签: ruby-on-rails postgresql rails-migrations

我从最新转储中恢复了数据库,并尝试运行rake测试。不幸的是,有30个迁移尚未完成我的第一个想法是评论30个迁移代码中的每个代码并运行'rake db:migrate',但必须有一个更简单的解决方案。我使用Rails 2.3.14和Postgresql 9.1.3。

3 个答案:

答案 0 :(得分:5)

如果要从转储中恢复数据库,schema_migrations表应该与其余表一起恢复。

这似乎表明您的schema_migrations表可能没有备份,这会导致您现在遇到的问题。

理想的解决方案是恢复包含所有表格的备份 - 包括schema_migrations

即使您决定在短期内找到解决方法,但从长远来看,正确的解决方案是修改备份脚本以获取所需所有表,包括{ {1}}。

就现在该做什么而言,理想的解决方案是从数据库备份一个表(schema_migrations)并将该数据导入您现在尝试加载的数据库中。然后,您的迁移不应再等待。

使用简单的表转储和加载脚本执行此操作应该没问题。简单的postgres gui PgAdminhttp://www.pgadmin.org/)也可以提供一些基本工具,用于转储然后加载单个表。

答案 1 :(得分:4)

凯文是对的。但是,他错过了一个关键点。

从备份还原时,它会还原schema_migrations表,该表跟踪需要运行的迁移。如果在您恢复的数据库上运行了这三十次迁移,则它们将无法运行。

但是,您的代码是在备份所代表的数据库快照之前进行的三十次迁移。

如果我部署,可能会发生这种情况,然后立即抓住生产备份。虽然迁移已在生产中运行,但我正在从办公时间之前到我的部署之前进行备份。我通常喜欢等一天才能获得第二天的备份。

或者,不要担心。您的备份是在这三十次迁移之前完成的,但随后它们已应用,因此迁移确保您的架构与您的代码版本匹配。这是件好事。

当备份发生变化时,请不要冒汗,明天再刷新。

答案 2 :(得分:0)

您还可以在db表中手动添加缺少的迁移的时间戳,例如:

>>> from collections import Counter

>>> def enum(listy):
>>>     counter = Counter(listy)
>>>     final = []
>>>     for val in range(len(counter)):
>>>         alp, times = counter.popitem()
>>>         temp = []
>>>         for p in range(1, times+1):
>>>             temp.append(alp+'-'+str(p))
>>>         final.extend(temp)
        
>>>     return final

>>> list_in = ['a','b','a']

>>> print(enum(list_in))
['b-1', 'a-1', 'a-2']

与临时删除迁移文件中的“创建”指令的效果相同。如果将迁移作为git部署过程的一部分来运行,则注释掉意味着您必须将这些更改推送到git。

如果您只是从事登台环境/开发环境,直接修复数据库可能比推送这些更改要好,这可能会使其他部署或开发人员感到困惑。