如何从一个数据库中提取数据、对其进行操作并将其插入 Rails 中的另一个数据库?
How can I extract data from one database, manipulate it, and insert it into another in Rails?
我有两个数据库(一个遗留 MySQL 一个和一个新的 PostgreSQL 数据库),新数据库的模式已经过重新设计。因此,我不能只是将旧数据库转储到 YAML 并将其加载到新数据库中,因为列的名称不同,可能需要进行操作。有没有一种优雅的方法可以做到这一点?
其实很简单。
首先,您需要在 database.yml 中定义与 MySQL 数据库的连接。我们称它为 legacy:
development:
adapter: postgresql
.....
test:
adapter: postgresql
.....
legacy:
adapter: mysql2
encoding: utf8
database: your_old_mysql_db
username: root
password:
host: localhost
port: 3306
您的 gem 文件中需要 mysql2 gem,以及 pg gem!
现在只需为每个要连接的 table 创建模型:
这是一个名为 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 table 中提取数据并将其粘贴到您的 Postgres table 中,如下所示:
# 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
我有两个数据库(一个遗留 MySQL 一个和一个新的 PostgreSQL 数据库),新数据库的模式已经过重新设计。因此,我不能只是将旧数据库转储到 YAML 并将其加载到新数据库中,因为列的名称不同,可能需要进行操作。有没有一种优雅的方法可以做到这一点?
其实很简单。 首先,您需要在 database.yml 中定义与 MySQL 数据库的连接。我们称它为 legacy:
development:
adapter: postgresql
.....
test:
adapter: postgresql
.....
legacy:
adapter: mysql2
encoding: utf8
database: your_old_mysql_db
username: root
password:
host: localhost
port: 3306
您的 gem 文件中需要 mysql2 gem,以及 pg gem!
现在只需为每个要连接的 table 创建模型:
这是一个名为 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 table 中提取数据并将其粘贴到您的 Postgres table 中,如下所示:
# 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