如何从一个数据库中提取数据、对其进行操作并将其插入 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