Rebase Rails在长期运行的项目中进行迁移

时间:2010-07-27 12:22:19

标签: ruby-on-rails ruby database migration

我在字典中的意思是“重新定位”,而不是git定义......

我有一个大型的,长期运行的Rails项目,大约有250次迁移,管理所有这些都变得笨拙。

也就是说,我确实需要一个基础来运行测试时清除和重建我的数据库。因此,这些数据非常重要。

是否有任何策略可以说,在设定点转储架构 - 归档所有旧迁移并重新开始新的迁移。

显然我可以使用rake schema:dump - 但实际上我需要一种方法,db:migrate将首先加载架构,然后开始运行其余的迁移。

我想继续使用迁移,因为它们在开发中非常有用,但是,我无法回溯并编辑2007年的迁移,因此保留它似乎很愚蠢。

3 个答案:

答案 0 :(得分:49)

通常,您不需要清理旧的迁移。如果您正在从头开始运行db:migrate(没有现有的db),Rails使用db / schema.rb来创建表而不是运行每次迁移。否则,它仅运行从当前架构升级到最新版本所需的迁移。

如果您仍希望将特定点的迁移合并为一个,您可以尝试:

  • 使用rake db:migrate VERSION=xxx
  • 从头开始迁移到目标架构
  • 使用rake db:schema:dump
  • 转储架构
  • 从一开始就删除迁移到xxx版本,并使用db / schema.rb的内容创建一个新的迁移(将create_table和add_index语句放入新迁移的self.up方法中)。

确保为汇总的新迁移选择一个旧的迁移版本号;否则,Rails会尝试在生产服务器上应用该迁移(这会擦除现有数据,因为create_table语句使用:force⇒true)。

无论如何,我不建议这样做,因为Rails通常可以很好地处理迁移。但是如果你仍然想要,请确保在生产服务器上存在数据丢失风险之前先仔细检查所有内容并先在本地尝试。

答案 1 :(得分:5)

要自动合并(或挤压)迁移,您可以使用Squasher gem

只需安装

即可
gem install squasher

使用日期运行,并且将合并该日期之前的迁移:

squasher 2016 # => Will merge all migration created before 2016

更多详情in the README

答案 2 :(得分:1)

除了提供的答案(这表明如何合并您的迁移量)之外,您还表示要清除数据(我假设在灯具填充表后手动添加);根据刷新初始数据状态,推断您。有些项目确实需要对基础数据进行大量改进,重建和重新填充表格。我们在很大程度上依赖于重复执行这些操作,并且我发现如果您可以完全将模式简化为SQL执行语句,那么表的重建速度将远远快于Ruby语法。

重建表的一个微不足道的进一步帮助是将单独的终端窗口专用于单个组合命令语句:

rake db:drop db:create db:schema:load db:fixtures:load

每当您需要重建和重新填充表格时,向上箭头和返回按键将完成日常工作。如果SQL执行语句中没有冲突,并且如果您在项目处于开发状态时没有进行进一步的迁移,那么SQL语句的执行速度可能比两倍快。 Ruby语法。例如,我们的表在20秒内以这种方式重建和重新填充,而Ruby语法将过程增加到超过50秒。如果您等待刷新数据以执行进一步的工作(特别是多次),这会对工作流程产生巨大影响。