把旧的数据库中的数据 load 到新数据库(新数据库表字段有差异)

把旧的数据库中的数据 load 到新数据库(新数据库表字段有差异)

  1. 安装 gem 'yaml_db'
    照例:
    Gemfile 中 加入 gem 'yaml_db'bundle

  2. 在旧的数据库环境下( database.yml 连接对应的数据库),运行 rake db:data:dump,会生成文件 db/data.yml。这个里面会把数据导出成数组格式。
    如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    users:
    columns:
    - id
    - email
    - nickname
    - created_at
    - updated_at
    records:
    - - 1
    - a@a.com
    - 1
    - ss
    - '2016-10-25 11:35:41'
    - '2016-10-25 14:26:11'
  3. 安装 gem 'bulk_insert'
    照例:
    Gemfile 中 加入 gem 'bulk_insert'bundle

  4. 在新的数据库环境下(修改database.yml连接对应的数据库),写 task ,读取data.yml文件,并写入新的数据库。
    rake -T 可以查看所有 rake 命令,找到自己的 rake 命令 并执行(本例:rake new_db:new_db_load)。

    task 代码:

    文件目录:lib/tasks/new_db_migration.rake

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    namespace :new_db do
    desc 'migrate old db data to new db'
    task :new_db_load => :environment do
    old_db = YAML.load_file('db/data.yml')
    User.bulk_insert(set_size: 100) do |worker|
    old_db['users']['records'].each do |record|
    worker.add(
    id: record[0], email: record[1], status: (record[2] == 1), nick_name: record[3], created_at: record[4], updated_at: record[5]
    )
    end
    end
    puts 'user finish'
    puts 'done!'
    end
    end

    上面我做的变更是 status ,原来是 0 或者1 ,现在改成 true 或 false ,通过 status: (record[2] == 1) 来符合新的结构。其余的变更都可以类似处理。