直到几个月前,我还在开发一个应用程序。之后,决定对该应用程序进行大修。这涉及更改大量数据库模式。为了实现这个目标,我们选择在另一个分支上工作。当我们不得不进行迁移时,我们没有麻烦自己包含处理数据库中可用的当前数据的代码,以便它与新的数据库模式兼容。这种发展持续了几个月。现在,我们需要从旧数据库模式中获取所有数据并将其迁移到新的数据库模式中。
这样的任务似乎很复杂,可以征求意见。有什么宝石可以帮助解决这个问题吗?谢谢
直到几个月前,我还在开发一个应用程序。之后,决定对该应用程序进行大修。这涉及更改大量数据库模式。为了实现这个目标,我们选择在另一个分支上工作。当我们不得不进行迁移时,我们没有麻烦自己包含处理数据库中可用的当前数据的代码,以便它与新的数据库模式兼容。这种发展持续了几个月。现在,我们需要从旧数据库模式中获取所有数据并将其迁移到新的数据库模式中。
这样的任务似乎很复杂,可以征求意见。有什么宝石可以帮助解决这个问题吗?谢谢
首先,我假设您使用的是像 MySql 这样的关系数据库,并且您有一些可管理的表数量。
这是一个涉及离散步骤的简单方法:
对于每张桌子,
但是,使用此方法,您可能会遇到数据验证错误。
第二种方法可以使用 CSV。在这里,我假设您在 Ruby 1.9.3 中使用 CSV。您可以将其切换为使用 FasterCSV 来处理旧的 Ruby。
在 rake 任务中,您可以尝试手动映射一些数据:
# Put this in lib/tasks/import.rb
require 'csv'
namespace :import do
desc 'import some data!'
task :from_csv do
CSV.foreach('path/to/file.csv') do |row|
model = YourNewModel.new(field_xyz: row[xyz], ...)
# ... maybe do some other stuff here if you need to process anything
model.save if model.valid? # maybe check if it's valid
end
end
end
当然,您必须将模型字段正确映射到 CSV 行。在此处查看 1.9.3 CSV 文档。
现在像这样运行 rake 任务:
$ cd /path/to/your/app && rake import:from_csv