Migraciones

29 10 2006

“rake migrate” permite mantener un control de versiones sobre las intervenciones realizadas en el esquema de las bases de datos.

Para que el proceso guarde consistencia, hay que emplearlo siempre que se desee intervenir sobre el esquema de la base de datos.

La estructura de la clase de una migración se divide en dos métodos:-“self.up” y “self.down”- el primero se encarga de operaciones de creación, mientras que el segundo de las de destrucción. El método de destrucción debe contener las operaciones inversas a las de creación para conseguir revertir la situación de la BBDD.

Generando una clase de migración

Existen tres posibilidades para generar una clase de migración:

  • Mediante el script: “generate migration”:
    $ruby script/generate migration descripcion_de_la_migracion
  • Creando en primer lugar el modelo de la tabla:
    $ruby script/generate model NombreModelo”
    genera: “00n_create_nombre_modelo.rb”
  • Creando manualmente el fichero “00n_create_nombre_modelo.rb”.

 
La forma más sencilla de evitar problemas, consiste en crear en primer lugar el modelo, ya que el propio script generará el correspondiente fichero para la migración, y sólo tendremos que editarlo y añadir el código correspondiente. Ver Nota [modelo]

Nota [nombres de la clase de migración]: El nombre deberá describir brevemente, la operación a realizar sobre la BBDD.
Nota [número añadido al nombre]: Lo añade el sistema automáticamente e indica la versión.

Sintaxis de la clase de migración

Las acciones (o transformaciones como se definen en su API) disponibles son las siguientes:

– Crear tabla:


create_table :nombre_tabla do |tabla|
   tabla.column :nombre_columna, :tipo_de_dato [,:opcion => valor]
   …
end


Nota [ubicación]: Estas operaciones se ubicarán en el método “self.up”.
Nota [nombre_tabla]: El nombre de la tabla se asignará en plural y con la primera letra en minúscula.
Nota [id]: No es necesario añadir el campo “id” en las tablas ya que se genera por defecto.
Nota [creación de múltiples tablas]: Se sitúa todo el código dentro del mismo método “self.up”.

Ver ejemplo1

– Tipos de dato disponibles para las columnas:

integer, float, datetime, date, timestamp, time, text, string, binary, boolean.

Nota [boolean]: Al asignar valores booleanos (por lo menos en mysql), éstos podrán ser 0 ó 1. Las opciones ‘true’ y ‘false’ no están permitidas. La razón, mysql no dispone del tipo ‘boolean’, éste se implementa mediante ‘tinyint’ de longitud uno.
– Ejemplo: t.column :aceptado, :boolean, :default => ‘1’

– Opciones disponibles para las columnas:

  • limit: Dimensión máxima del contenido.
  • default: Valor por defecto.
  • null: Si el contenido puede ser nulo o no.

Nota [null]: :null => false implica NO NULO

– Clave foránea (foreign key):

En principio, no es necesario su uso, ya que lo correcto es trabajar a nivel de aplicación empleando la sintaxis de relaciones “has_one” … No obstante, desde la versión 1.0 de Rails, podemos añadirlas empleando SQL directamente mediante: execute ‘sentencia_sql’.

– Poblar tabla:

Entenderemos por “poblar tablas”, a introducir datos en las mismas.

Nombre_tabla.create :nombre_columna_1 => ‘contenido’, :nombre_columna_n => ‘contenido’

Nota [ubicación]: Estas operaciones se ubicarán en el método “self.up”.
Nota [Nombre_tabla]: la referencia de “create” a la tabla se realiza en singular y con la primera letra en mayúscula.
Nota [modelo]: Para poder emplear ‘create’ así como ‘find’ o ‘new’, es necesario que exista el correspondiente modelo.
Ver [Generando una clase de migración]
Ver ejemplo 1

– Destruir tabla:

drop_table :nombre_tabla

Nota [ubicación]: Estas operaciones se ubicarán en el método “self.down”.
Nota [nombre_tabla]: El nombre de la tabla se asignará en plural y con la
primera letra en minúscula.
Nota [destrucción de múltiples tablas]: Se sitúa todo el código dentro del mismo método “self.up”.

Ver ejemplo 1

– Renombrar tabla:

rename_table :nombre_antigüo,:nombre_nuevo

Nota [ubicación]: Estas operaciones se ubicarán en ambos métodos “self.down” y “self.up”.
Nota [nombre_antiguo,nombre_nuevo]: El nombre de la tabla se asignará en plural y con la primera letra en minúscula.

Ver ejemplo 2

– Añadir columna:

add_column(:nombre_tabla, :nombre_columna, tipo, opciones)
Ver ejemplo 3

– Eliminar columna:

remove_column(:nombre_tabla, :nombre_columna)
Ver ejemplo 3

– Renombrar columna:

rename_column(:nombre_tabla, :nombre_columna_antigüo, :nombre_columna_nuevo)
Ver ejemplo 4

– Modificar columna:

change_column(:nombre_tabla, :nombre_columna, tipo, opciones)
Ver ejemplo 5

Migraciones irreversibles

En algunas transformaciones no se contempla la posibilidad de retorno (normalmente en las asociadas a supresión de datos), en esos casos deberemos añadir en el correspondiente método “down” la excepción:
raise IrreversibleMigration .

Realizando la migración

$rake migrate

En caso de tener problemas durante el proceso podemos recurrir a las siguientes opciones, que nos permitirán monitorizar el proceso:

$rake migrate -t
$rake migrate –trace

Sobre la tabla “schema_info”:

Si verificamos el contenido de la BBDD tras ejecutar “raque migrate”, veremos que junto a las tablas definidas se ha creado una tabla nueva llamada “schema_info”. Su única función consiste en guardar el número de la última migración aplicada, este dato lo emplea el script de migración para saber qué migraciones tiene que aplicar en cada momento al actualizar un esquema.
Nota[actuaciones sobre schema-info]: No existe necesidad de actuar sobre ella.

Retornando a otra versión

Tan simple como especificar el número de versión

$rake migrate VERSION=numero_de_version

En caso de desear purgar la base de datos, esto es, eliminar todas las tablas, bastará con indicar la versión 0.

$rake migrate VERSION=0

Nota[fichero version]: no tiene por qué existir un fichero 000_nombre_migracion.rb

Especificar la base de datos sobre la que actuar

Rails recomienda el uso de tres tipos de bases de datos: desarrollo, prueba y producción. Para especificar a “rake migrate” sobre cuál deberá realizar las migraciones se añade el parámetro: “RAILS_ENV=tipo_basededatos”.

Ejemplo de ejecución sobre la BBDD de producción:
$rake migrate RAILS_ENV=production

Ejemplo de retorno a la versión 3 de la BBDD de desarrollo:
$rake migrate VERSION=3 RAILS_ENV=development

Ejemplos

Ejemplo 1:
Creación y poblado de una tabla con su correspondiente destrucción.
ejemplo1
Ejemplo 2:
Renombrado de una tabla.
ejemplo2
Ejemplo 3:
Añadir y eliminar columnas.
ejemplo3
Ejemplo 4:
Renombrar columna.
ejemplo4
Ejemplo 5:
Modificar columna.
ejemplo5

fuente: rubyonrails
fuente: wiki.rubyonrails
fuente: econectados->onrails
fuente: hackerdude->rails
fuente: sobrerailes
fuente: bloggingrailsconf

Add to Technorati Favorites

Anuncios

Acciones

Information

One response

21 10 2006
Los ojos de mi conciencia » Blog Archive » Migraciones en RoR

[…] Aqui un resumen de lo que hay que saber sobre las migraciones […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




A %d blogueros les gusta esto: