rails 数据和模型迁移策略
strategy for rails data and model migration
我需要迁移一些数据。我需要解密一些字段(这没问题),但完成后我需要更新模型以使用不同的数据访问策略。
有没有办法避免两次部署? (一个用于迁移,一个用于迁移完成后的模型更新?)我需要在迁移中使用旧模型,但是我需要新模型。
您可以在迁移中添加虚拟 ActiveRecord
模型。然后您的迁移不再依赖于原始模型及其实现。这允许您更新原始模型中的代码。
像这样:
class MigrateFooOnBar < ActiveRecord::Migration
class Bar < ActiveRecord::Base
def foo_migration
self.foo = some_deprecated_code
end
end
def up
add_column :bars, :foo
Bar.find_each do |bar|
bar.foo_migrate
bar.save!
end
end
# ...
end
但这并不能解决核心问题:迁移永远不会 运行 在部署应用程序的同一时间进行。部署应用程序时,在切换到新代码和 Rails 应用重启之前或之后进行迁移的步骤 运行。
取决于您的迁移需要多长时间 - 在大表上可能 运行 几分钟(和几小时) - 您的应用程序将面临 运行 旧代码在较新的数据库架构,或者必须 运行 旧数据库架构上的新代码。
为了避免在 运行进行此类迁移时使应用程序脱机,您将不得不部署多个步骤:
- 部署向数据库添加新列的迁移
- 部署可以 运行 两个版本架构的代码更改
- 运行旧数据的数据传输和回填任务
- 部署消除向后兼容性的代码
- 运行 移除旧列的迁移
我需要迁移一些数据。我需要解密一些字段(这没问题),但完成后我需要更新模型以使用不同的数据访问策略。
有没有办法避免两次部署? (一个用于迁移,一个用于迁移完成后的模型更新?)我需要在迁移中使用旧模型,但是我需要新模型。
您可以在迁移中添加虚拟 ActiveRecord
模型。然后您的迁移不再依赖于原始模型及其实现。这允许您更新原始模型中的代码。
像这样:
class MigrateFooOnBar < ActiveRecord::Migration
class Bar < ActiveRecord::Base
def foo_migration
self.foo = some_deprecated_code
end
end
def up
add_column :bars, :foo
Bar.find_each do |bar|
bar.foo_migrate
bar.save!
end
end
# ...
end
但这并不能解决核心问题:迁移永远不会 运行 在部署应用程序的同一时间进行。部署应用程序时,在切换到新代码和 Rails 应用重启之前或之后进行迁移的步骤 运行。
取决于您的迁移需要多长时间 - 在大表上可能 运行 几分钟(和几小时) - 您的应用程序将面临 运行 旧代码在较新的数据库架构,或者必须 运行 旧数据库架构上的新代码。
为了避免在 运行进行此类迁移时使应用程序脱机,您将不得不部署多个步骤:
- 部署向数据库添加新列的迁移
- 部署可以 运行 两个版本架构的代码更改
- 运行旧数据的数据传输和回填任务
- 部署消除向后兼容性的代码
- 运行 移除旧列的迁移