Rails Rails 中不同工程中数据迁移

michael_roshen · 2013年08月21日 · 最后由 javaite 回复于 2013年08月23日 · 3251 次阅读

背景: 有些项目,新旧项目同时维护,当有把旧项目中的数据迁移到新项目的需求的时候,有几个问题 1. 两个项目(A,B)都用同样的数据库 pg,需要在一个项目中写 rake 任务,执行迁移。 2. 要迁移的数据不完全相同(部分相同) 3. 把 A 中的两个表 table_a, table_b 移到 B 中的四张表 table_1,table_2..(因为新项目 B 业务逻辑增加,或者进行了优化,所以要把旧项目的数据导入到新结构中)

目前采用的解决方案: 在新项目 B 中写 rake 任务,把 A 中涉及到的模型拿到 B 中来,为了避免类名冲突,加上了命名空间 --app --models --xx(namespace) --modle_a --modle_b 模型中指定表名,否则会去数据库中找 xx_modle_as 这个表,另外,使用 establish_connection 来链接项目 A 的数据库

class Xx::ClassA < ActiveRecord::Base
  self.table_name = "class_as"
  establish_connection A_DATABASE
  ..
end

新建 config/initializers/database_config.rb 文件

db_config = YAML.load_file(File.join(File.dirname(__FILE__), "../database_a.yml"))
if Rails.env.eql?("development")
  A_DATABASE = db_config["development"]
else
  A_DATABASE = db_config["production"]
end

在 database_a.yml 中添加项目 A 的数据库配置信息

在写 rake 任务的时候,即使项目 A,B 中有相同的类,也不会冲突了

namesapce "prices" do
 desc "data migration"
  task :migrate => :environment do
    ClassA.all
    Xx::ClassA.all
  end
end

=========================================================== 功能实现了,因为过一段事件以后,还可能再做迁移,这样这部分代码就不能去掉,但是感觉代码变得非常的丑,不知道有没有更好的办法,大神们,第一次提问题,不要让为冷场啊,不知道问题描述清楚了没有,请指教!!!

不知道具体情况如何,如果是我的话,我的第一反应是重新规划数据库,规划的时候就想好如何安排旧的数据库的数据。接着写个独立的脚本(不搀和进 Rails)把旧数据读出来、整理好、写进新数据库。旧的数据库应该不会变化表结构吧?所以以后有增加的数据就复用这个脚本好了。

不过这么一来,新项目的模型肯定是要做相应的修改了,因为就没打算把旧模型拿进来直接用,感觉很不爽。

#1 楼 @nightire 独立脚本怎么写,拼 sql 吗?感觉拼 sql 很麻烦,尤其是有关联关系的时候

#2 楼 @michael_roshen

谁说 Rails 的模块不能单独拿出来用呢?而且 ORM 层也不只有 Rails 一家实现的好吧? https://www.ruby-toolbox.com/categories/orm

#3 楼 @nightire 我知道可以单独拿出来啊,但是没明白你的意思,写独立的脚本是要把项目 AB 中得模块都拿出来,单独连数据库,还是怎么样?

#4 楼 @michael_roshen 我猜想 @nightire 的意思是写一个只用做迁移的项目,只包含最少的模块,用作迁移,不污染现有项目。

历史数据迁移的话,推荐用 squeel 去做历史数据的读取

#5 楼 @zlx_star 嗯,应该是这样的,thx

#6 楼 @rainchen 插件看上去不错,记下了

sequel -C 不错

可以用 pg 的触发器

需要 登录 后方可回复, 如果你还没有账号请 注册新账号