sábado, 2 de abril de 2016

Ruby on Rails: migraciones

Una migración (migration) es la evolución del modelo de datos. Cada migración produce una versión del esquema de base de datos. Con este sistema de migraciones podríamos ir hacia adelante o hacia atrás en la versión del esquema. Ir hacia adelante es crear una nueva migración con cualquier operación DDL: añadir una nueva tabla, añadir o suprimir una tabla o realizar modificaciones en la estructura del registro como añadir un nuevo campo o alterar o suprimir un campo. Ten en cuenta que ir hacia atrás (ver rollback más abajo) puede potencialmente eliminar tablas y en definitiva destruir datos simplemente por el hecho de que no estaban en la versión anterior. CUIDADO.

Aquí os dejo este chuletario con los comandos más recurrentes en relación con las migraciones. Si no estás familiarizado con la expresión "bundle exec" que antepongo a los comandos, te recomiendo que revisites este post.

Primero, un par de ejemplos de migración. Primero Añadimos la tabla "nuevatabla". A continuación añadimos el campo "column" a la tabla Table. Esto que tenemos aquí son 2 MIGRACIONES, porque hemos modificado 2 veces sucesivas el esquema de base de datos.
bundle exec rails generate model nuevatabla campo1:string campo2:string
bundle exec rails generate migration AddColumnToTable column:tipo
Ejecuta la migración del entorno indicado en RAILS_ENV. Por defecto será en development.
bundle exec rake db:migrate

Ejecuta la migración del entorno indicado en RAILS_ENV. Como se observa es en production. Todos los comandos siguientes pueden incorporar también la variable RAILS_ENV aunque no lo indiquemos.
bundle exec rake db:migrate RAILS_ENV=production

Para deshacer la última migración empleamos la fórmula siguiente:
bundle exec rake db:rollback
Si quereoms deshacer una cantidad de migraciones que conocemos perfectamente podemos usar STEP. En el ejemplo desharíamos 2 migraciones.
bundle exec rake db:rollback STEP=2
Si por el contrario queremos ir a una versión concreta del esquema de base de datos, sea la cantidad de pasos hacia adelante o hacia atrás que sean, indicamos la versión con la variable VERSION.
bundle exec rake db:migrate:down VERSION=20160506210540
El numerito de la versión es una marca de tiempo con la que se etiqueta la migración. También es el nombre del fichero donde se guarda. Los tenemos todos en "db/migrate" de tu directorio de proyecto rails. Si ordenas por fecha dejando abajo los más recientes puedes hacerte una idea de qué deshacer con rollback.