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_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

用于从旧数据库读取单个记录的代码

ActiveRecord::Base.establish_connection(old_database)
doctor_attributes = Doctor.order(:id).limit(1).offset(offset).first.attributes
ActiveRecord::Base.remove_connection

接下来是使doctor_params符合新表结构的代码。在新数据库中创建条目的代码如下。

ActiveRecord::Base.establish_connection(new_database)
Doctor.create(doctor_params)

问题是最后一行中的 Doctor 对象具有旧数据库的属性。是我没有正确处理数据库连接还是有其他问题?

我尝试了以下方法

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

不知何故,医生模型被旧数据库卡住了。

我解决了下面的问题

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

感觉很"hackey",我确信它在处理大型数据库时效率不高,但它是解决我的危机情况的方法。我的数据库有大约 8000 个条目,所以我不担心效率考虑。

尝试,

Doctor.establish_connection :new_database
Doctor.create doctor_params

# 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

最新更新