aramirez.es

Alberto Ramírez Website


2 de septiembre de 2010

Doctrine Migrations: ejemplo de uso básico

2 comentarios >>

Inspirado por un buen post de Asier Marqués: Desarrolo ágil con symfony, doctrine y mysql workbench en el que nos habla de como usar Mysql workbench y un plugin que nos permite exportar nuestra base de datos a formato YAML, he decidido contar mi corta experiencia con Doctrine migrations.

Hace poco comencé a usar esta opción que nos brinda a todos el ORM Doctrine. Tras dos o tres task lanzados, ya me enteraba de como funciona, es más, empecé a cogerle el gusto...

La idea parte teniendo un schema.yml inicial, una BBDD en el servidor y la necesidad de incorporar cambios en ambos. El uso es mucho más extenso, pero me voy a centrar en los siguiente:

Teniendo el schema.yml

# config/doctrine/schema.yml

Category:
columns:
id:
type: integer(11)
notnull: true
autoincrement: true
primary: true
unsigned: true
name:
type: string(255)

Y la BBDD en el servidor exactamente tal y como se declara en el schema.

Se necesita aplicar un cambio en la BBDD (añadir/eliminar columna, modificar una relación, etc.).

# config/doctrine/schema.yml

Category:
columns:
id:
type: integer(11)
notnull: true
autoincrement: true
primary: true
unsigned: true
name:
type: string(255)
Item:
columns:
id:
type: integer(11)
notnull: true
autoincrement: true
primary: true
unsigned: true
category_id:
type: integer(11)
notnull: true
unsigned: true
name:
type: string(255)
relations:
Category:
local: category_id
foreign: id
type: one
foreignAlias: Items

Cómo hacemos esto?

1. Modificar el schema.yml para aplicar el cambio.

2. Lanzar el task $ php symfony doctrine:generate-migrations-diff. Esto crea una estructura de ficheros en el directorio lib/ del proyecto:

  • lib/migration/doctrine (Directorio que contiene los cambios a aplicar)
  • x_versionN.php (Archivo que contiene los cambios para pasar a la versión N)
  • Tabla migration_version en el servidor, que almacena la versión actual.
// lib/migration/doctrine/1283537548_version1.php

class Version1 extends Doctrine_Migration_Base
{
public function up()
{
$this->createTable('item', array(
'id' =>
array(
'type' => 'integer',
'autoincrement' => '1',
'primary' => '1',
'unsigned' => '1',
'length' => '11',
),
'category_id' =>
array(
'type' => 'integer',
'notnull' => '1',
'unsigned' => '1',
'length' => '11',
),
'name' =>
array(
'type' => 'string',
'length' => '255',
),
), array(
'primary' =>
array(
0 => 'id',
),
));
}

public function down()
{
$this->dropTable('item');
}
}
// lib/migration/doctrine/1283537549_version2.php

class Version2 extends Doctrine_Migration_Base
{
public function up()
{
$this->createForeignKey('item', 'item_category_id_category_id', array(
'name' => 'item_category_id_category_id',
'local' => 'category_id',
'foreign' => 'id',
'foreignTable' => 'category',
));
$this->addIndex('item', 'item_category_id', array(
'fields' =>
array(
0 => 'category_id',
),
));
}

public function down()
{
$this->dropForeignKey('item', 'item_category_id_category_id');
$this->removeIndex('item', 'item_category_id', array(
'fields' =>
array(
0 => 'category_id',
),
));
}
}

3. Lanzar el task $ php symfony doctrine:migrate. Aplica en la BBDD los cambios que se crearon en el paso anterior. Se le pueden pasar parámetros (entorno, up / down, etc.)

4. Por último se reconstruyen las clases del modelo: $ php symfony doctrine:build --all-classes

5. No nos olvidemos de borrar la cache..

Con esto, ya tenemos los cambios que requerimos, aplicados tanto en nuestro proyecto Symfony como en nuestra BBDD. Fácil y rápido.

Enlaces:

Proyecto de prueba creado para el post

Documentación doctrine migrations

Transparencia presentada en Symfony Live 2010 por Dennis

Tags: | | | | |


Comentarios

  • Javi
  • #1 Javi (20/09/2010 12:41)
  • Muy bueno el post, me has ayudado a hacer mi primera migration, ;)
  • aRamirez
  • #2 aRamirez (22/09/2010 20:18)
  • Gracias! Me alegra que te haya servido :D
Deja tu comentario

zukeidigital 2008