Ruby on rails Rails ActiveRecord将数据从旧数据库复制到新数据库

Ruby on rails Rails ActiveRecord将数据从旧数据库复制到新数据库,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我必须将我的应用程序数据从旧应用程序数据库移动到新应用程序数据库。表的结构是不同的。我写了以下脚本 require 'mysql2' require 'active_record' old_database = { adapter: "mysql2", host: "localhost", username: "foo", password: "bar", database: "old_db", socket: "/var/run/mysqld/mysqld.sock" } new

我必须将我的应用程序数据从旧应用程序数据库移动到新应用程序数据库。表的结构是不同的。我写了以下脚本

require 'mysql2'
require 'active_record'

old_database = {
adapter:  "mysql2",
host:     "localhost",
username: "foo",
password: "bar",
database: "old_db",
socket: "/var/run/mysqld/mysqld.sock"
}

new_database = {
adapter:  "mysql2",
encoding: "utf8mb4",
collation: "utf8mb4_bin",
host:     "localhost",
username: "foo",
password: "bar",
database: "new_db",
socket: "/var/run/mysqld/mysqld.sock"
}

class Doctor < ActiveRecord::Base  
end
接下来是用新表结构使doctor_参数一致的代码。在新数据库中创建条目的代码如下所示

ActiveRecord::Base.establish_connection(new_database)
Doctor.create(doctor_params)
问题是最后一行中的医生对象具有旧数据库的属性。我是否没有正确处理数据库连接,或者是否存在其他问题

我尝试了以下方法

ActiveRecord::Base.establish_connection(old_db)
ActiveRecord::Base.establish_connection(new_db)
doctor = Doctor.new #Instance of doctor as per new database
但如果我这样做了

ActiveRecord::Base.establish_connection(old_db)
doctor = Doctor.new # instance of doctor as per old database
ActiveRecord::Base.establish_connection(new_db)
doctor = Doctor.new # Still instance of doctor as per new database
不知怎的,医生模型被旧数据库卡住了。

试试看

Doctor.establish_connection :new_database
Doctor.create doctor_params
有,

#config/database.yml
默认值:&默认值
适配器:mysql2
主机:本地主机
用户名:foo
密码:bar
套接字:/var/run/mysqld/mysqld.sock
旧数据库:

我解决了这个问题

require 'mysql2'
require 'active_record'    

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end

class Doctor < ApplicationRecord
  old_database = {
    adapter:  "mysql2",
    host:     "localhost",
    username: "foo",
    password: "bar",
    database: "old_db"
  }
  establish_connection(old_database)
end

class NewDoctor < ApplicationRecord
  new_database = {
    adapter:  "mysql2",
    encoding: "utf8mb4",
    collation: "utf8mb4_bin",
    host:     "localhost",
    username: "foo",
    password: "bar",
    database: "new_db",
    socket: "/var/run/mysqld/mysqld.sock"
  }
  self.table_name = 'doctors'
  establish_connection(new_database)
end
需要“mysql2”
需要“活动记录”
类ApplicationRecord

它感觉像“黑客”,我确信它在处理大型数据库时效率不高,但它可以解决我的危机情况。我的数据库大约有8000个条目,所以我不担心效率问题。

事实上我正在尝试。不幸的是,它没有起作用。我做了如下的ActiveRecord::Base.build_connection(old_db)ActiveRecord::Base.build_connection(new_db)doctor=doctor.new#根据新数据库创建医生实例,但如果我写ActiveRecord::Base.build_connection(old_db)doctor=doctor.new#根据旧数据库创建医生实例ActiveRecord::Base.build##connection(new#db)doctor=doctor.new#根据新数据库,仍然是doctor的实例。不知何故,doctor模型被旧数据库卡住了。能否尝试在
config/database.yml
中列出这两个连接,然后在建立连接时使用连接名称
# config/database.yml

default: &default
  adapter: mysql2
  host: localhost
  username: foo
  password: bar
  socket: /var/run/mysqld/mysqld.sock

old_database:
  <<: *default
  database: old_db

new_database:
  <<: *default
  database: new_db
  encoding: utf8mb4
  collation: utf8mb4_bin
require 'mysql2'
require 'active_record'    

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end

class Doctor < ApplicationRecord
  old_database = {
    adapter:  "mysql2",
    host:     "localhost",
    username: "foo",
    password: "bar",
    database: "old_db"
  }
  establish_connection(old_database)
end

class NewDoctor < ApplicationRecord
  new_database = {
    adapter:  "mysql2",
    encoding: "utf8mb4",
    collation: "utf8mb4_bin",
    host:     "localhost",
    username: "foo",
    password: "bar",
    database: "new_db",
    socket: "/var/run/mysqld/mysqld.sock"
  }
  self.table_name = 'doctors'
  establish_connection(new_database)
end