我从最新转储中恢复了数据库,并尝试运行rake测试。不幸的是,有30个迁移尚未完成我的第一个想法是评论30个迁移代码中的每个代码并运行'rake db:migrate',但必须有一个更简单的解决方案。我使用Rails 2.3.14和Postgresql 9.1.3。
答案 0 :(得分:5)
如果要从转储中恢复数据库,schema_migrations
表应该与其余表一起恢复。
这似乎表明您的schema_migrations
表可能没有备份,这会导致您现在遇到的问题。
理想的解决方案是恢复包含所有表格的备份 - 包括schema_migrations
。
即使您决定在短期内找到解决方法,但从长远来看,正确的解决方案是修改备份脚本以获取所需所有表,包括{ {1}}。
就现在该做什么而言,理想的解决方案是从数据库备份一个表(schema_migrations
)并将该数据导入您现在尝试加载的数据库中。然后,您的迁移不应再等待。
使用简单的表转储和加载脚本执行此操作应该没问题。简单的postgres gui PgAdmin(http://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。
如果您只是从事登台环境/开发环境,直接修复数据库可能比推送这些更改要好,这可能会使其他部署或开发人员感到困惑。