如何从一个数据库中提取数据,对其进行操作,然后将其插入到Rails中的另一个数据库?

时间:2015-11-13 16:40:39

标签: mysql ruby-on-rails database database-migration data-migration

我有两个数据库(一个遗留的MySQL数据库和一个新的PostgreSQL数据库),并重新设计了新数据库的模式。因此,我不能只将旧数据库转储到YAML并将其加载到新数据库中,因为列被命名为不同的东西,可能需要进行操作。是否有一种优雅的方式来做到这一点?

1 个答案:

答案 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