我必须将我的应用数据从旧的应用数据库移动到新的应用数据库。表结构不同。我写了以下脚本。
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