SlideShare une entreprise Scribd logo
1  sur  39
Télécharger pour lire hors ligne
Migrate, una herramienta de
trabajo y desarrollo
Ramon Vilar
Sobre mi
Ramon Vilar
ramon@ymbra.com
@rvilar
Índice
01. Migración en Drupal
02. Conceptos básicos
03. Creación de una migración
04. Típicas situaciones en migraciones
05. Migrate en nuestro proceso de desarrollo
06. Migrate cómo framework
MIGRACIÓN EN DRUPAL
Migración en Drupal (I)
●

A la hora de enfocar un proyecto de migración en
Drupal hay 3 grandes soluciones:
–

By hand

–

Scripts personalizados

–

Feeds

–

Migrate
Migración en Drupal (II)
●

By Hand
–
–

●

Una locura: mucho tiempo y “muy” caro
(Quien piense en un becario su karma se verá reducido a menos
infinito)

Scripts personalizados
–

Tan flexible cómo quieras

–

Tienes que picarlo todo

–

No está integrado con lógica Drupal y menos aún con Drupal

–

Tracking? Rollback?
Migración en Drupal (III)
●

Feeds
–

Buena opción y muy bien documentado

–

Fácil de configurar y con soporte a distintos formatos
(RSS, Atom, CSV, base de datos, etc.)

–

Permite el mapeo de campos

–

Problemas con el rendimiento

–

Falta de integración con Drush

–

No funciona muy bien con las referencias a otros tipos
de contenidos
Migración en Drupal (y IV)
●

Migrate
–

Framework orientado a objetos para entrar contenidos a
Drupal

–

Fuente de datos diversa: CSV, DB, XML, JSON, etc.

–

Soporte para migrar a distintos tipos de contenido:
●

Nodo, usuario... cualquier entidad del core

●

Puedes definir tu própio handler (Media, Commerce, etc)

–

Rápido

–

Integración con Drush

–

Curva de aprendizaje: debemos programarlo todo.
CONCEPTOS BÁSICOS
Conceptos en Migrate
●

Antes de empezar, hay que dejar claros algunos conceptos
del día a día en una migración (y de Migrate):
–

Origen de datos

–

Destino de datos

–

Mapeo Origen-Destino

–

Mapeo de campos

–

Field handler

–

Destination handler
Origen de datos
●

Es el conjunto de datos desde dónde migraremos

●

Puede provenir de diversos tipos de fuente
$this->source = new MigrateSourceSQL($query);
Destino de datos
●

●

●

Es el lugar dónde se almacenarán los datos
migrados.
Esto puede ser una entidad (nodo, usuario, etc.) o
una tabla específica.
Cada registro de los datos de origen corresponde
con un registro de los datos de destino.
$this->destination = new
MigrateDestinationNode('migrate_example_beer');
Mapeo Origen-Destino
●

●

●

Establece una relación entre los ids del origen y los del destino.
Esto permite poder volver a ejecutar migraciones, ir hacia atrás,
actualizar registros, borrarlos y lo más importante....
Permite gestionar referencias de este contenido en otras migraciones.
$this->map = new MigrateSQLMap($this->machineName,
array(
'bid' => array(
'type' => 'int',
'not null' => TRUE,
)
),
MigrateDestinationNode::getKeySchema()
);
Mapeo de campos
●

Hace falta mapear el campo origen al campo destino.

●

Multitud de posibilidades.
$this->addFieldMapping('body', 'text');
$this->addFieldMapping('body:summary', 'excerpt');
$this->addFieldMapping('field_favbeers', 'beers')
->separator('|');
$this->addFieldMapping('title', 'name')
->defaultValue('Testing title');
$this->addFieldMapping('uid', 'accountid')
->sourceMigration('WineUser')
->defaultValue(1);
Field handler
●

Transforma los datos orígen en el formato/estructura que Drupal
entiende (basado en el tipo de campo). De:
$row->bar = array('foo', 'bar')
a algo más comprensible por Drupal:
$entity_field_bar = array(
'und' => array(
0 => array('value' => 'foo'),
1 => array('value' => 'bar'),
),
);

●

Ej. MigrateAddressFieldHandler, MigrateGeoFieldHandler
Destination handler
●

●

●

Se encarga de gestionar los datos procesados y
guardarlos en la entidad correspondiente.
Permite además, extender las destinaciones
existentes en el núcleo para añadir funcionalidad
extra
Ej. MigratePathautoHandler,
MigrateExtrasFlagHandler
Migrate extras
●

●

●

Este módulo extiende Migrate para añadir soporte
para diversos módulos contribuidos.
Añade soporte para migrar: Address Field, Entity
API, Flag, Media, etc.
En la página del módulo se puede consultar el
listado de módulos soportados y el estado de las
peticiones de soporte de otros módulos.
CREACIÓN DE UNA MIGRACIÓN
Pasos a seguir
1. Crear un módulo custom (con dependencia de Migrate). Por
ejemplo: migrate_myproject
2. Comunicar a Migrate que existimos (hook)
3. Crear una clase por cada migración y:
1. Añadir información sobre el origen de datos
2. Añadir información sobre el destino de los datos
3. Mapear el origen y el destino
4. Mapear los campos origen y destino.
5. De forma opcional, manipular los campos antes de guardarlos.

4. Registrar la clase de migración en el fichero .info del módulo
Crear módulo y hook
●

●

El fichero .module estará en blanco
Debemos crear un fichero llamado migrate_myproject.migrate.inc y
llamar al hook
function migrate_myproject_migrate_api() {
$api = array(
'api' => 2,
'groups' => array(
'fruits' => array(
'title' => t('Fruits'),
),
),
'migrations' => array(
'Apple' => array('class_name' => 'AppleMigration',
'group_name' => 'fruits'),
)
);
return $api;
}
Una clase = una migración
Class AppleMigration extend Migration {...}
●

●

Toda la lógica de migración la deberemos hacer
en el contructor de esta (método __construct).
Existen tres métodos opcionales que nos permiten
manipular los datos:
–

prepareRow($row)

–

prepare($entity, $row)

–

complete($entity, $row)
Flujo de la importación
●

●

●

●

●

●

Migrate itera en el origen de datos
Llama a prepareRow($row) permitiéndonos modificar los
datos o rechazarlos.
Migrate aplica los handlers y transforma $row en $entity
Llama a prepare($row, $entity) para poder modificar la
entidad antes de salvarla.
Se guarda la entidad.
Migrate setea el ID de la entidad y llama a complete($row,
$entity) para poder trabajar con él.
Implementación (I)
●

Especificar el origen, el destino, el mapeo origen-destino y
el mapeo de campos cómo hemos visto anteriormente.
class AppleMigration extends Migration {
public function __construct() {
parent::__construct();
$this->source = <my_source>;
$this->destination = <my_destination>;
$this->map = <my_map>;
$this->addFieldMapping($dst_field,
$src_field);
}
}
Implementación (II)
prepareRow($row)
●

●

Recibe un objeto que es un registro orígen a
migrar.
Nos permite hacer modificaciones o devolver
FALSE si no queremos migrar el registro.
$row->name = $row->name . ' ' . $row->surname;
$row->created = strtotime($row->init);
Implementación (III)
prepare($row, $entity)
●

●

●

Permite trabajar con la entidad por Migrate creada a partir
de los datos origen antes de salvarla.
Hemos de tener en cuenta que los datos modificados en
$entity deben tener el formato del campo de la entidad.
Se puede usar este método para añadir valores a campos
que no tienen handler.
$entity->field_link['und'][0]['value'] =
'http://drupal.org/project/migrate';
Implementación (y IV)
complete($row, $entity)
●

●

Se llama justo después de haber guardado la
entidad (ya tenemos disponible el ID).
Se puede usar para crear otras entidades que
necesiten esta información.
Registro en el .info
●

Todos los ficheros con clases de migración deben
estar listados en el fichero .info (típico error)
name = MyProject Migrate
description = ...
dependencies[] = migrate
files[] = apple.inc
Lanzar migraciones (I)
●

●

●

●

●

Se puede lanzar las migraciones desde la UI.
Es fácil, intuitivo y nos da información en todo
momento.
Pero un poco lento...
Si hemos programado todo esto, no nos vamos a
pasar a la UI, no?
A los devs nos gusta drush!
Lanzar migraciones (II)
drush migrate-status
drush migrate-import Apple
drush migrate-import Apple –limit=”10 seconds”
drush migrate-import Apple –feedback=”10 items”
drush migrate-rollback Apple
drush migrate-rollback Apple –idlist=4,9
●

Y muchos más...
TÍPICAS SITUACIONES EN
MIGRACIONES
Conexión a BD antigua
●

Es normal que el proyecto conste de migrar desde
una base de datos antigua.
$query = Database::getConnection('default',
'for_migration')
->select('tags', 't')
->fields('t', array('id_tag', 'tag'));
$this->source = new MigrateSourceSQL($query);
Migración de imágenes embebidas
●

●

Puede ser que queramos migrar estas imágenes a
entidades de Media.
El módulo Migrate Extras nos da soporte para
migrar este tipo de entidades y además nos da
una función muy útil.
public function prepare($node, $row) {
MigrateDestinationMedia::rewriteImgTags
($node, $field_text);
}
Redirecciones en URLs antiguas
●

●

Un requerimiento típico en migraciones es la
conservación de las URLs antiguas a través de
redirecciones.
Migrate nos da soporte para poder hacer esto a
través de un parche.
$this->addFieldMapping('migrate_redirects',
'old_legacy_path');
MIGRATE EN NUESTRO PROCESO DE
DESARROLLO: CONTENIDO DE
PRUEBA
Generar contenido de prueba (I)
●

●

●

●

●

Quién no ha pasado horas metiendo contenido de
prueba en un proyecto?
Y cuando haces una modificación, quién se encarga
de meter contenido de pruebas?
Y si trabajamos en distintos entornos? (dev, staging,
pre)
Siempre pasa que las pruebas de contenido no se
van haciendo...
Y si pudiésemos hacerlo de forma automática?
Generar contenido de prueba (II)
●

●

●

●

Crear CSVs con contenidos de pruebas para Nodos,
términos, usuarios, enlaces de menú, imágenes, etc.
Crear unos pequeños scripts para importar el contenido.
Y todo esto se hace una vez y ya lo podemos usar para
todos nuestros proyectos y entornos.
Podemos programar pruebas a partir de esto de forma
automatizada, integrarlo con nuestro Jenkins, etc.
MIGRATE CÓMO
FRAMEWORK
Migrate sobre migrate
●

Se han creado módulos sobre Migrate para
migraciones específicas:
–

Drupal-to-Drupal data migration

–

WordPress Migrate

–

Commerce Migrate

–

TYPO3 migrate

–

phpBB2Drupal
Contacto
●

Twitter: @rvilar

●

Correo: ramon@ymbra.com

●

Web: http://ymbra.com

●

Grácias a todos(as) ¿Preguntas?

Contenu connexe

Similaire à Migrate, una herramienta de trabajo y desarrollo

Entidades en drupal 8
Entidades en drupal 8Entidades en drupal 8
Entidades en drupal 8Atenea tech
 
Clase 14 bundles útiles
Clase 14 bundles útilesClase 14 bundles útiles
Clase 14 bundles útileshydras_cs
 
Visualizando Datos: la geolocalización como herramienta emergente de análisis...
Visualizando Datos: la geolocalización como herramienta emergente de análisis...Visualizando Datos: la geolocalización como herramienta emergente de análisis...
Visualizando Datos: la geolocalización como herramienta emergente de análisis...GEDEM CED
 
LabAndroid: Taller "Mi Primera Aplicación Android"
LabAndroid: Taller "Mi Primera Aplicación Android"LabAndroid: Taller "Mi Primera Aplicación Android"
LabAndroid: Taller "Mi Primera Aplicación Android"Alberto Ruibal
 
Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6Gabriela Bosetti
 
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.Juan Manuel
 
MyBatis como alternativa a Hibernate
MyBatis como alternativa a HibernateMyBatis como alternativa a Hibernate
MyBatis como alternativa a HibernateRubén Aguilera
 
MobileCONGalicia Introducción a Android
MobileCONGalicia Introducción a AndroidMobileCONGalicia Introducción a Android
MobileCONGalicia Introducción a AndroidAlberto Ruibal
 
Taller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con DjangoTaller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con DjangoJuan Rodríguez
 
Presentacion sobre cassandra
Presentacion sobre cassandraPresentacion sobre cassandra
Presentacion sobre cassandrajesusnoseq
 
Desarrollo android almacenamiento de datos
Desarrollo android    almacenamiento de datosDesarrollo android    almacenamiento de datos
Desarrollo android almacenamiento de datosFernando Cejas
 
Presentación sobre Display Suite en el Drupal Day Valencia 2012
Presentación sobre Display Suite en el Drupal Day Valencia 2012Presentación sobre Display Suite en el Drupal Day Valencia 2012
Presentación sobre Display Suite en el Drupal Day Valencia 2012Atenea tech
 

Similaire à Migrate, una herramienta de trabajo y desarrollo (20)

Entidades en drupal 8
Entidades en drupal 8Entidades en drupal 8
Entidades en drupal 8
 
Clase 14 bundles útiles
Clase 14 bundles útilesClase 14 bundles útiles
Clase 14 bundles útiles
 
Visualizando Datos: la geolocalización como herramienta emergente de análisis...
Visualizando Datos: la geolocalización como herramienta emergente de análisis...Visualizando Datos: la geolocalización como herramienta emergente de análisis...
Visualizando Datos: la geolocalización como herramienta emergente de análisis...
 
9.laravel
9.laravel9.laravel
9.laravel
 
Doctrine2 sf2Vigo
Doctrine2 sf2VigoDoctrine2 sf2Vigo
Doctrine2 sf2Vigo
 
Hibernate - Introducción
Hibernate - IntroducciónHibernate - Introducción
Hibernate - Introducción
 
Memoria dinamica
Memoria dinamicaMemoria dinamica
Memoria dinamica
 
LabAndroid: Taller "Mi Primera Aplicación Android"
LabAndroid: Taller "Mi Primera Aplicación Android"LabAndroid: Taller "Mi Primera Aplicación Android"
LabAndroid: Taller "Mi Primera Aplicación Android"
 
Web Mapping con Django
Web Mapping con DjangoWeb Mapping con Django
Web Mapping con Django
 
Segunda sesion
Segunda sesionSegunda sesion
Segunda sesion
 
Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6Introducción al desarrollo Web: Frontend con Angular 6
Introducción al desarrollo Web: Frontend con Angular 6
 
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
Parte II. Notas Rapidas (sticky notes) App W8: MVVM y SQLite.
 
MyBatis como alternativa a Hibernate
MyBatis como alternativa a HibernateMyBatis como alternativa a Hibernate
MyBatis como alternativa a Hibernate
 
Introducción a DJango
Introducción a DJangoIntroducción a DJango
Introducción a DJango
 
MobileCONGalicia Introducción a Android
MobileCONGalicia Introducción a AndroidMobileCONGalicia Introducción a Android
MobileCONGalicia Introducción a Android
 
Taller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con DjangoTaller de introducción al desarrollo web con Django
Taller de introducción al desarrollo web con Django
 
Presentacion sobre cassandra
Presentacion sobre cassandraPresentacion sobre cassandra
Presentacion sobre cassandra
 
Python scraping
Python scrapingPython scraping
Python scraping
 
Desarrollo android almacenamiento de datos
Desarrollo android    almacenamiento de datosDesarrollo android    almacenamiento de datos
Desarrollo android almacenamiento de datos
 
Presentación sobre Display Suite en el Drupal Day Valencia 2012
Presentación sobre Display Suite en el Drupal Day Valencia 2012Presentación sobre Display Suite en el Drupal Day Valencia 2012
Presentación sobre Display Suite en el Drupal Day Valencia 2012
 

Plus de Ymbra

El universo JavaScript en Drupal 8
El universo JavaScript en Drupal 8El universo JavaScript en Drupal 8
El universo JavaScript en Drupal 8Ymbra
 
Arquitectura de proyectos Drupal
Arquitectura de proyectos DrupalArquitectura de proyectos Drupal
Arquitectura de proyectos DrupalYmbra
 
Field Types API: Field, widgets y formatters
Field Types API: Field, widgets y formattersField Types API: Field, widgets y formatters
Field Types API: Field, widgets y formattersYmbra
 
Desarrollo y arquitectura de proyectos con Features
Desarrollo y arquitectura de proyectos con FeaturesDesarrollo y arquitectura de proyectos con Features
Desarrollo y arquitectura de proyectos con FeaturesYmbra
 
Distribuciones en Drupal
Distribuciones en DrupalDistribuciones en Drupal
Distribuciones en DrupalYmbra
 
Introducció al Git
Introducció al GitIntroducció al Git
Introducció al GitYmbra
 
Views 3: Qué hay de nuevo
Views 3: Qué hay de nuevoViews 3: Qué hay de nuevo
Views 3: Qué hay de nuevoYmbra
 
ELISAVA Beta. Cas d'èxit desenvolupat per Ymbra
ELISAVA Beta. Cas d'èxit desenvolupat per YmbraELISAVA Beta. Cas d'èxit desenvolupat per Ymbra
ELISAVA Beta. Cas d'èxit desenvolupat per YmbraYmbra
 
Drupal 7: mucho más que una nueva versión (para desarrolladores)
Drupal 7: mucho más que una nueva versión (para desarrolladores)Drupal 7: mucho más que una nueva versión (para desarrolladores)
Drupal 7: mucho más que una nueva versión (para desarrolladores)Ymbra
 
Drupal 7 multilingüe: internacionalització i localització de llocs web
Drupal 7 multilingüe: internacionalització i localització de llocs webDrupal 7 multilingüe: internacionalització i localització de llocs web
Drupal 7 multilingüe: internacionalització i localització de llocs webYmbra
 
El universo JavaScript en Drupal 7
El universo JavaScript en Drupal 7El universo JavaScript en Drupal 7
El universo JavaScript en Drupal 7Ymbra
 
Drupal 7: mucho más que una nueva versión
Drupal 7: mucho más que una nueva versiónDrupal 7: mucho más que una nueva versión
Drupal 7: mucho más que una nueva versiónYmbra
 
Desmitificant l'HTML5
Desmitificant l'HTML5Desmitificant l'HTML5
Desmitificant l'HTML5Ymbra
 

Plus de Ymbra (13)

El universo JavaScript en Drupal 8
El universo JavaScript en Drupal 8El universo JavaScript en Drupal 8
El universo JavaScript en Drupal 8
 
Arquitectura de proyectos Drupal
Arquitectura de proyectos DrupalArquitectura de proyectos Drupal
Arquitectura de proyectos Drupal
 
Field Types API: Field, widgets y formatters
Field Types API: Field, widgets y formattersField Types API: Field, widgets y formatters
Field Types API: Field, widgets y formatters
 
Desarrollo y arquitectura de proyectos con Features
Desarrollo y arquitectura de proyectos con FeaturesDesarrollo y arquitectura de proyectos con Features
Desarrollo y arquitectura de proyectos con Features
 
Distribuciones en Drupal
Distribuciones en DrupalDistribuciones en Drupal
Distribuciones en Drupal
 
Introducció al Git
Introducció al GitIntroducció al Git
Introducció al Git
 
Views 3: Qué hay de nuevo
Views 3: Qué hay de nuevoViews 3: Qué hay de nuevo
Views 3: Qué hay de nuevo
 
ELISAVA Beta. Cas d'èxit desenvolupat per Ymbra
ELISAVA Beta. Cas d'èxit desenvolupat per YmbraELISAVA Beta. Cas d'èxit desenvolupat per Ymbra
ELISAVA Beta. Cas d'èxit desenvolupat per Ymbra
 
Drupal 7: mucho más que una nueva versión (para desarrolladores)
Drupal 7: mucho más que una nueva versión (para desarrolladores)Drupal 7: mucho más que una nueva versión (para desarrolladores)
Drupal 7: mucho más que una nueva versión (para desarrolladores)
 
Drupal 7 multilingüe: internacionalització i localització de llocs web
Drupal 7 multilingüe: internacionalització i localització de llocs webDrupal 7 multilingüe: internacionalització i localització de llocs web
Drupal 7 multilingüe: internacionalització i localització de llocs web
 
El universo JavaScript en Drupal 7
El universo JavaScript en Drupal 7El universo JavaScript en Drupal 7
El universo JavaScript en Drupal 7
 
Drupal 7: mucho más que una nueva versión
Drupal 7: mucho más que una nueva versiónDrupal 7: mucho más que una nueva versión
Drupal 7: mucho más que una nueva versión
 
Desmitificant l'HTML5
Desmitificant l'HTML5Desmitificant l'HTML5
Desmitificant l'HTML5
 

Dernier

Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estossgonzalezp1
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21mariacbr99
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxJorgeParada26
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativanicho110
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.FlorenciaCattelani
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...JohnRamos830530
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxFederico Castellari
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxAlan779941
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosJhonJairoRodriguezCe
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanamcerpam
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIhmpuellon
 

Dernier (11)

Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos Basicos
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 

Migrate, una herramienta de trabajo y desarrollo

  • 1. Migrate, una herramienta de trabajo y desarrollo Ramon Vilar
  • 3. Índice 01. Migración en Drupal 02. Conceptos básicos 03. Creación de una migración 04. Típicas situaciones en migraciones 05. Migrate en nuestro proceso de desarrollo 06. Migrate cómo framework
  • 5. Migración en Drupal (I) ● A la hora de enfocar un proyecto de migración en Drupal hay 3 grandes soluciones: – By hand – Scripts personalizados – Feeds – Migrate
  • 6. Migración en Drupal (II) ● By Hand – – ● Una locura: mucho tiempo y “muy” caro (Quien piense en un becario su karma se verá reducido a menos infinito) Scripts personalizados – Tan flexible cómo quieras – Tienes que picarlo todo – No está integrado con lógica Drupal y menos aún con Drupal – Tracking? Rollback?
  • 7. Migración en Drupal (III) ● Feeds – Buena opción y muy bien documentado – Fácil de configurar y con soporte a distintos formatos (RSS, Atom, CSV, base de datos, etc.) – Permite el mapeo de campos – Problemas con el rendimiento – Falta de integración con Drush – No funciona muy bien con las referencias a otros tipos de contenidos
  • 8. Migración en Drupal (y IV) ● Migrate – Framework orientado a objetos para entrar contenidos a Drupal – Fuente de datos diversa: CSV, DB, XML, JSON, etc. – Soporte para migrar a distintos tipos de contenido: ● Nodo, usuario... cualquier entidad del core ● Puedes definir tu própio handler (Media, Commerce, etc) – Rápido – Integración con Drush – Curva de aprendizaje: debemos programarlo todo.
  • 10. Conceptos en Migrate ● Antes de empezar, hay que dejar claros algunos conceptos del día a día en una migración (y de Migrate): – Origen de datos – Destino de datos – Mapeo Origen-Destino – Mapeo de campos – Field handler – Destination handler
  • 11. Origen de datos ● Es el conjunto de datos desde dónde migraremos ● Puede provenir de diversos tipos de fuente $this->source = new MigrateSourceSQL($query);
  • 12. Destino de datos ● ● ● Es el lugar dónde se almacenarán los datos migrados. Esto puede ser una entidad (nodo, usuario, etc.) o una tabla específica. Cada registro de los datos de origen corresponde con un registro de los datos de destino. $this->destination = new MigrateDestinationNode('migrate_example_beer');
  • 13. Mapeo Origen-Destino ● ● ● Establece una relación entre los ids del origen y los del destino. Esto permite poder volver a ejecutar migraciones, ir hacia atrás, actualizar registros, borrarlos y lo más importante.... Permite gestionar referencias de este contenido en otras migraciones. $this->map = new MigrateSQLMap($this->machineName, array( 'bid' => array( 'type' => 'int', 'not null' => TRUE, ) ), MigrateDestinationNode::getKeySchema() );
  • 14. Mapeo de campos ● Hace falta mapear el campo origen al campo destino. ● Multitud de posibilidades. $this->addFieldMapping('body', 'text'); $this->addFieldMapping('body:summary', 'excerpt'); $this->addFieldMapping('field_favbeers', 'beers') ->separator('|'); $this->addFieldMapping('title', 'name') ->defaultValue('Testing title'); $this->addFieldMapping('uid', 'accountid') ->sourceMigration('WineUser') ->defaultValue(1);
  • 15. Field handler ● Transforma los datos orígen en el formato/estructura que Drupal entiende (basado en el tipo de campo). De: $row->bar = array('foo', 'bar') a algo más comprensible por Drupal: $entity_field_bar = array( 'und' => array( 0 => array('value' => 'foo'), 1 => array('value' => 'bar'), ), ); ● Ej. MigrateAddressFieldHandler, MigrateGeoFieldHandler
  • 16. Destination handler ● ● ● Se encarga de gestionar los datos procesados y guardarlos en la entidad correspondiente. Permite además, extender las destinaciones existentes en el núcleo para añadir funcionalidad extra Ej. MigratePathautoHandler, MigrateExtrasFlagHandler
  • 17. Migrate extras ● ● ● Este módulo extiende Migrate para añadir soporte para diversos módulos contribuidos. Añade soporte para migrar: Address Field, Entity API, Flag, Media, etc. En la página del módulo se puede consultar el listado de módulos soportados y el estado de las peticiones de soporte de otros módulos.
  • 18. CREACIÓN DE UNA MIGRACIÓN
  • 19. Pasos a seguir 1. Crear un módulo custom (con dependencia de Migrate). Por ejemplo: migrate_myproject 2. Comunicar a Migrate que existimos (hook) 3. Crear una clase por cada migración y: 1. Añadir información sobre el origen de datos 2. Añadir información sobre el destino de los datos 3. Mapear el origen y el destino 4. Mapear los campos origen y destino. 5. De forma opcional, manipular los campos antes de guardarlos. 4. Registrar la clase de migración en el fichero .info del módulo
  • 20. Crear módulo y hook ● ● El fichero .module estará en blanco Debemos crear un fichero llamado migrate_myproject.migrate.inc y llamar al hook function migrate_myproject_migrate_api() { $api = array( 'api' => 2, 'groups' => array( 'fruits' => array( 'title' => t('Fruits'), ), ), 'migrations' => array( 'Apple' => array('class_name' => 'AppleMigration', 'group_name' => 'fruits'), ) ); return $api; }
  • 21. Una clase = una migración Class AppleMigration extend Migration {...} ● ● Toda la lógica de migración la deberemos hacer en el contructor de esta (método __construct). Existen tres métodos opcionales que nos permiten manipular los datos: – prepareRow($row) – prepare($entity, $row) – complete($entity, $row)
  • 22. Flujo de la importación ● ● ● ● ● ● Migrate itera en el origen de datos Llama a prepareRow($row) permitiéndonos modificar los datos o rechazarlos. Migrate aplica los handlers y transforma $row en $entity Llama a prepare($row, $entity) para poder modificar la entidad antes de salvarla. Se guarda la entidad. Migrate setea el ID de la entidad y llama a complete($row, $entity) para poder trabajar con él.
  • 23. Implementación (I) ● Especificar el origen, el destino, el mapeo origen-destino y el mapeo de campos cómo hemos visto anteriormente. class AppleMigration extends Migration { public function __construct() { parent::__construct(); $this->source = <my_source>; $this->destination = <my_destination>; $this->map = <my_map>; $this->addFieldMapping($dst_field, $src_field); } }
  • 24. Implementación (II) prepareRow($row) ● ● Recibe un objeto que es un registro orígen a migrar. Nos permite hacer modificaciones o devolver FALSE si no queremos migrar el registro. $row->name = $row->name . ' ' . $row->surname; $row->created = strtotime($row->init);
  • 25. Implementación (III) prepare($row, $entity) ● ● ● Permite trabajar con la entidad por Migrate creada a partir de los datos origen antes de salvarla. Hemos de tener en cuenta que los datos modificados en $entity deben tener el formato del campo de la entidad. Se puede usar este método para añadir valores a campos que no tienen handler. $entity->field_link['und'][0]['value'] = 'http://drupal.org/project/migrate';
  • 26. Implementación (y IV) complete($row, $entity) ● ● Se llama justo después de haber guardado la entidad (ya tenemos disponible el ID). Se puede usar para crear otras entidades que necesiten esta información.
  • 27. Registro en el .info ● Todos los ficheros con clases de migración deben estar listados en el fichero .info (típico error) name = MyProject Migrate description = ... dependencies[] = migrate files[] = apple.inc
  • 28. Lanzar migraciones (I) ● ● ● ● ● Se puede lanzar las migraciones desde la UI. Es fácil, intuitivo y nos da información en todo momento. Pero un poco lento... Si hemos programado todo esto, no nos vamos a pasar a la UI, no? A los devs nos gusta drush!
  • 29. Lanzar migraciones (II) drush migrate-status drush migrate-import Apple drush migrate-import Apple –limit=”10 seconds” drush migrate-import Apple –feedback=”10 items” drush migrate-rollback Apple drush migrate-rollback Apple –idlist=4,9 ● Y muchos más...
  • 31. Conexión a BD antigua ● Es normal que el proyecto conste de migrar desde una base de datos antigua. $query = Database::getConnection('default', 'for_migration') ->select('tags', 't') ->fields('t', array('id_tag', 'tag')); $this->source = new MigrateSourceSQL($query);
  • 32. Migración de imágenes embebidas ● ● Puede ser que queramos migrar estas imágenes a entidades de Media. El módulo Migrate Extras nos da soporte para migrar este tipo de entidades y además nos da una función muy útil. public function prepare($node, $row) { MigrateDestinationMedia::rewriteImgTags ($node, $field_text); }
  • 33. Redirecciones en URLs antiguas ● ● Un requerimiento típico en migraciones es la conservación de las URLs antiguas a través de redirecciones. Migrate nos da soporte para poder hacer esto a través de un parche. $this->addFieldMapping('migrate_redirects', 'old_legacy_path');
  • 34. MIGRATE EN NUESTRO PROCESO DE DESARROLLO: CONTENIDO DE PRUEBA
  • 35. Generar contenido de prueba (I) ● ● ● ● ● Quién no ha pasado horas metiendo contenido de prueba en un proyecto? Y cuando haces una modificación, quién se encarga de meter contenido de pruebas? Y si trabajamos en distintos entornos? (dev, staging, pre) Siempre pasa que las pruebas de contenido no se van haciendo... Y si pudiésemos hacerlo de forma automática?
  • 36. Generar contenido de prueba (II) ● ● ● ● Crear CSVs con contenidos de pruebas para Nodos, términos, usuarios, enlaces de menú, imágenes, etc. Crear unos pequeños scripts para importar el contenido. Y todo esto se hace una vez y ya lo podemos usar para todos nuestros proyectos y entornos. Podemos programar pruebas a partir de esto de forma automatizada, integrarlo con nuestro Jenkins, etc.
  • 38. Migrate sobre migrate ● Se han creado módulos sobre Migrate para migraciones específicas: – Drupal-to-Drupal data migration – WordPress Migrate – Commerce Migrate – TYPO3 migrate – phpBB2Drupal
  • 39. Contacto ● Twitter: @rvilar ● Correo: ramon@ymbra.com ● Web: http://ymbra.com ● Grácias a todos(as) ¿Preguntas?