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

dav*_*ley 43 ruby database migration ruby-on-rails

我在字典中的意思是"变基",而不是git定义......

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

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

是否有任何策略可以说,将模式转储到设定点 - 归档所有旧迁移并重新开始新的迁移.

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

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

Zar*_*ony 50

通常,您不需要清理旧的迁移.如果您正在从头开始运行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通常可以很好地处理迁移.但是,如果您仍然想要,请务必仔细检查所有内容并首先在本地尝试,然后再冒生产服务器上的数据丢失风险.

  • @weexpectedTHIS这就是为什么你不应该在迁移中触及数据的原因. (5认同)
  • @weexpectedTHIS通过运行自定义后期部署脚本 (5认同)
  • 您是否意识到只有在迁移中没有添加数据时才能使用此功能?schema.rb不存储迁移期间创建的任何数据. (3认同)

Koe*_*en. 6

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

只需安装

gem install squasher
Run Code Online (Sandbox Code Playgroud)

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

squasher 2016 # => Will merge all migration created before 2016
Run Code Online (Sandbox Code Playgroud)

README中的更多细节