把旧的数据库中的数据 load 到新数据库(新数据库表字段有差异)
安装
gem 'yaml_db'
照例:
Gemfile
中 加入gem 'yaml_db'
并bundle
在旧的数据库环境下( database.yml 连接对应的数据库),运行
rake db:data:dump
,会生成文件db/data.yml
。这个里面会把数据导出成数组格式。
如下:1234567891011121314users:columns:- id- email- nickname- created_at- updated_atrecords:- - 1- a@a.com- 1- ss- '2016-10-25 11:35:41'- '2016-10-25 14:26:11'安装
gem 'bulk_insert'
照例:
Gemfile
中 加入gem 'bulk_insert'
并bundle
在新的数据库环境下(修改database.yml连接对应的数据库),写 task ,读取data.yml文件,并写入新的数据库。
rake -T
可以查看所有 rake 命令,找到自己的 rake 命令 并执行(本例:rake new_db:new_db_load
)。task 代码:
文件目录:
lib/tasks/new_db_migration.rake
12345678910111213141516171819namespace :new_db dodesc 'migrate old db data to new db'task :new_db_load => :environment doold_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])endendputs 'user finish'puts 'done!'endend上面我做的变更是
status
,原来是 0 或者1 ,现在改成 true 或 false ,通过status: (record[2] == 1)
来符合新的结构。其余的变更都可以类似处理。