在长时间运行的项目中重新实现Rails迁移

我的意思是“rebasing”在字典中,而不是git定义…

我有一个大型的,长期运行的Rails项目,有大约250次迁移,但是pipe理所有这些变得难以处理。

也就是说,在运行testing时,我确实需要从中清除和重build数据库。 所以这些数据是很重要的。

有没有人有任何策略可以说,倾向于在一个设定点的架构 – 归档所有旧的迁移,并重新开始新的迁移。

很明显,我可以使用rake模式:转储 – 但我真的需要一种方式:db:migrate将首先加载模式,然后开始运行其余的迁移。

我想继续使用迁移,因为它们在开发中非常有用,但是,我不能从2007年开始编辑迁移,因此保留它似乎很愚蠢。

一般来说,你不需要清理旧的迁移。 如果您正在运行db:从头开始迁移(不存在数据库),则Rails使用db / schema.rb创build表,而不是运行每个迁移。 否则,它只运行从当前模式升级到最新模式所需的迁移。

如果您仍然希望将迁移到某个特定位置,您可以尝试:

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

确保为您的聚合新迁移select旧的迁移版本号之一; 否则,Rails将尝试在生产服务器上应用该迁移(因为create_table语句使用:force⇒true),所以将擦除现有数据。

无论如何,我不会推荐这样做,因为Rails通常会自行处理迁移。 但是,如果您仍然希望,请务必仔细检查所有内容,并在本地先尝试在生产服务器上丢失数据。

为了自动合并(或挤压)迁移,你可以使用Squasher gem

只需安装

 gem install squasher 

并使用date运行,并在该date之前的迁移将被合并:

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

README中的更多细节

除了提供的答案(这也说明了如何整合你的迁移量),你需要指出一个关于清除数据的问题(我假设在你的表格填充之后手动添加)。 这意味着你正在刷新一个初始数据状态。 有些项目确实需要对基础数据,重build和表格重新进行深入细化。 我们在很大程度上依赖于重复执行这些操作,而且我发现如果您可以将模式完全减less到SQL执行语句,那么您的表的重build速度将比使用Ruby语法快得多。

在重build表格的过程中,进一步的帮助是将一个单独的terminal窗口分配给一个组合的命令语句:

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

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