【问题标题】:Delete old migrations files in a Rails app在 Rails 应用程序中删除旧的迁移文件
【发布时间】:2025-12-14 21:15:02
【问题描述】:

如果架构稳定,是否允许删除(或归档)Rails 应用程序中的旧迁移文件?

我的迁移很多,我怀疑那里可能存在一些问题,因为我偶尔会在 Heroku 上迁移数据库时遇到问题。

【问题讨论】:

标签: ruby-on-rails rails-migrations


【解决方案1】:

您无需在 Rails 应用程序中保留旧的迁移文件,因为您的数据库架构应该在 schema.rb 或可用于重新生成架构的等效 SQL 文件中捕获。

迁移不是您的数据库架构的权威来源。该角色属于 db/schema.rb 或 Active Record 通过检查数据库生成的 SQL 文件。它们不是为编辑而设计的,它们只是代表数据库的当前状态。

无需(而且容易出错)通过回放整个迁移历史来部署应用的新实例。将当前模式的描述加载到数据库中会更简单、更快捷,该描述位于 schema.rb 或 SQL 文件中。
此文件应进行版本控制并保存在源代码管理中。

要设置自动生成 schema.rb,请通过 config.active_record.schema_format 设置修改 config/application.rb,它可以是 :ruby 或 :sql。 如果选择了 :ruby,则模式存储在 db/schema.rb 中。 如果选择 :sql,则模式将以原生 SQL 格式转储 你的数据库。

【讨论】:

  • 这完全正确。一个警告:迁移可用于影响数据库的内容,而不是结构。例如,您可能拥有转换数据的 SQL(可能是规范化、转换为小写或大写等)。另一个用途是一些清理任务(删除旧记录,更正数据创建中的早期逻辑错误等)。最后,应该在seeds.db 中完成的事情有时会在迁移中完成。这种迁移的使用是否正确是另一个问题——只是要注意你应该小心。
  • 旧迁移文件应该怎么办?简单地删除它们感觉不对。
  • 不同意上面的@TomHarrisonJr 只是因为这些事情应该“有时在迁移中完成” - 不应依赖迁移文件中的那些 SQL 约束、触发器、存储过程等。相反,config.active_record.schema_format 应该是:sqlOR,覆盖rake:db:setup 任务以运行定义这些事情的后续 SQL 命令(活动记录/schema.rb 不能)。我同意其他所说的一切:)。
【解决方案2】:

您可以删除旧的迁移。完成此操作后,在设置应用程序时,您需要运行:

rake db:schema:load

代替:

rake db:migrate

【讨论】:

    【解决方案3】:

    这就是我所做的,我发现在生产ActiveRecord::SchemaMigration.last.version 上迁移的最后一个版本并在我的源代码中删除了之前的所有迁移。

    不是最好的方法,但我做了find db/migrate -type f,复制了最后一个版本之前的文件列表和pbpaste | rm(macos)。

    【讨论】: