注:我们的情景:以前是 php 的项目改成 rails 的项目,数据库也打算重新建一个。数据库都是 postgresql ,大体数据结构类似,但是 有表字段名字不同,字段类型不同,我们现在就是把原来的数据 搞到我们新的数据库中。然后应用能 work。对数据库不熟,所以没有选择数据库脚本做。
安装 gem 'yaml_db'
照例:
Gemfile
中 加入 gem 'yaml_db'
并 bundle
在旧的数据库环境下(database.yml 连接对应的数据库),运行 rake db:data:dump
,会生成文件 db/data.yml
。这个里面会把数据导出成数组格式。
如下:
users:
columns:
- id
- email
- status
- nickname
- created_at
- updated_at
records:
- - 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
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)
操作来符合新的数据结构。其余的变更都可以类似处理。