我有两个数据库(一个遗留的MySQL数据库和一个新的PostgreSQL数据库),并重新设计了新数据库的模式。因此,我不能只将旧数据库转储到YAML并将其加载到新数据库中,因为列被命名为不同的东西,可能需要进行操作。是否有一种优雅的方式来做到这一点?
答案 0 :(得分:4)
实际上相当容易。 首先,您需要在 database.yml 中定义与MySQL数据库的连接。我们称之为遗产:
development:
adapter: postgresql
.....
test:
adapter: postgresql
.....
legacy:
adapter: mysql2
encoding: utf8
database: your_old_mysql_db
username: root
password:
host: localhost
port: 3306
你需要宝石文件中的mysql2 gem,以及pg gem!
现在只需为要连接的每个表创建模型:
这是一个名为LegacyUser的程序,它可以让你的老用户从你的MySQL数据库中获取:
# app/models/legacy_user.rb
class LegacyUser < ActiveRecord::Base
establish_connection :legacy
self.table_name = "whatever_your_my_sql_user_table_name_is"
end
现在,在Rake任务中,您可以从MySQL表中提取数据并将其粘贴到Postgres表中,如下所示:
# lib/tasks/import.rake
namespace :import do
desc "Import Users"
task users: :environment do
puts ""
puts "Importing Legacy Users:"
LegacyUser.find_each do |lu|
print "#{lu.id} - #{lu.first_name}"
u = User.new
u.email = lu.email
u.first_name = lu.first_name
u.last_name = lu.last_name
if u.save
puts "... saved"
else
puts "... bad: #{u.errors.full_messages.join(',')}"
end
end
end
end
现在你可以运行:
rake import:users