run rails migrations column change_column ruby-on-rails database-design merge

ruby-on-rails - migrations - reset db rails



Bases de datos de Merging Rails (3)

Tengo dos bases de datos con la misma estructura. Las tablas tienen un número entero como clave principal tal como se usa en Rails.

Si tengo una tabla de pacientes, tendré un paciente usando la clave primaria 123 en una base de datos y otro paciente usando la misma clave primaria en la otra base de datos.

¿Qué sugieres para fusionar los datos de ambas bases de datos?


Establezca ambas bases de datos con entradas en config / database.yml, luego genere una nueva migración.

Utilice ActiveRecord :: Base.establish_connection para alternar entre las dos bases de datos en la migración de esta manera:

def self.up ActiveRecord::Base.establish_connection :development patients = Patient.find(:all) ActiveRecord::Base.establish_connection :production patients.each { |patient| Patient.create patient.attributes.except("id") } end

YMMV según la cantidad de registros y las asociaciones entre modelos.


Por cierto, tiene más sentido que esto sea una tarea de rake o capistrano en lugar de una migración.


Si sus bases de datos son exactamente iguales (los datos no requieren procesamiento personalizado) y no hay demasiados registros, puede hacerlo (lo que permite las claves externas):

No probado ... Pero entiendes la idea

#All models and their foreign keys tales = {Patients => [:doctor_id, :hospital_id], Doctors => [:hospital_id], Hospitals} ActiveRecord::Base.establish_connection :development max_id = tables.map do |model| model.maximum(:id) end.max + 1000 tables.each do |model, fks| ActiveRecord::Base.establish_connection :development records = model.find(:all) ActiveRecord::Base.establish_connection :production records.each do |record| #update the foreign keys fks.each do |attr| record[attr] += max_id if not record[attr].nil? end record.id += max_id model.create record.attributes end end

Si tiene MUCHOS registros, puede que tenga que dividirlos de alguna manera ... hágalo en grupos de 10k o algo así.