Me encuentro en la necesidad de hacer una migración de una base de datos en mySQL a otra nueva en la que los modelos no son del todo iguales; básicamente hemos cambiado el modelo de datos (en mayor o menor medida) en una nueva versión de una aplicación que estamos usando, pasando de PHP pelado a Ruby on Rails en el proceso, pero claro, deseamos mantener los datos de la antigua base de datos.
La cuestión es que no sé cómo hacer para obtener datos de una tabla del viejo modelo de base de datos y hacer un save en el nuevo modelo. Leo por ahí que lo mejor es hacerlo en una task, pero no me termina de quedar claro y quería conocer vuestra opinión.
Script en PHP que lea de la vieja, transforme a la estructura de la nueva e inserte... a saco.
Si hay estructuras "anidadas" deberás mantener la relación, generar ids antes de insertar u obtenerlos de los inserts si son auto-increment y arrastrarlo al insert de los hijos, etc.
Si son muchos datos yo haría un script que saque los datos con limit y offset, y crearía un "proceso padre" que haga un count de total a importar, calcule el tamaño y offset de cada "hilo" y lo lanzaría en varios hilos.
Para evitar cosas raras con los ids, lo que he pensado es en leer de la origen (de alguna manera) e ir seteando en el modelo nativo de RoR y que se guarde en cada iteración. Voy a intentar que todo quede en RoR, pero si veo que esto da mucha guerra... Al final miraré otras opciones :P
A partir de ahí, el entorno de Rails ya está listo para usarse. Si os pasa como a mí y necesitáis hacer una migración de una base de datos a otra nueva, podéis cambiar la conexión que usa ActiveRecord en un momento dado de esta manera:
Lo que he hecho es guardar en arrays los resultados e iterar por ellos estando de nuevo en la base de datos más nueva, relleno los modelos y los guardo.
Me encuentro en la necesidad de hacer una migración de una base de datos en mySQL a otra nueva en la que los modelos no son del todo iguales; básicamente hemos cambiado el modelo de datos (en mayor o menor medida) en una nueva versión de una aplicación que estamos usando, pasando de PHP pelado a Ruby on Rails en el proceso, pero claro, deseamos mantener los datos de la antigua base de datos.
La cuestión es que no sé cómo hacer para obtener datos de una tabla del viejo modelo de base de datos y hacer un save en el nuevo modelo. Leo por ahí que lo mejor es hacerlo en una task, pero no me termina de quedar claro y quería conocer vuestra opinión.
¿Cómo lo veis?
21/10/2015 13:52
Si hay estructuras "anidadas" deberás mantener la relación, generar ids antes de insertar u obtenerlos de los inserts si son auto-increment y arrastrarlo al insert de los hijos, etc.
Si son muchos datos yo haría un script que saque los datos con limit y offset, y crearía un "proceso padre" que haga un count de total a importar, calcule el tamaño y offset de cada "hilo" y lo lanzaría en varios hilos.
Suerte! ;)
21/10/2015 13:59
Para evitar cosas raras con los ids, lo que he pensado es en leer de la origen (de alguna manera) e ir seteando en el modelo nativo de RoR y que se guarde en cada iteración. Voy a intentar que todo quede en RoR, pero si veo que esto da mucha guerra... Al final miraré otras opciones :P
22/10/2015 10:01
Básicamente he creado un script en la carpeta scripts de mi proyecto que tiene las siguientes líneas al comienzo:
#!/usr/bin/env ruby
ENV['RAILS_ENV'] = "development"
require '../config/environment.rb'
require 'active_record'
A partir de ahí, el entorno de Rails ya está listo para usarse. Si os pasa como a mí y necesitáis hacer una migración de una base de datos a otra nueva, podéis cambiar la conexión que usa ActiveRecord en un momento dado de esta manera:
def change_connection(db_name)
conn_config = ActiveRecord::Base.connection_config
conn_config[:database] = db_name
ActiveRecord::Base.establish_connection conn_config
end
Lo que he hecho es guardar en arrays los resultados e iterar por ellos estando de nuevo en la base de datos más nueva, relleno los modelos y los guardo.
Espero que le sea de ayuda a alguno.
:3