La API de Migraciones es un sistema muy flexible y poderoso que te permite recolectar datos de diferentes fuentes y almacenarlos en Drupal. De hecho, esta es un framework completo de “extraer, transformar y cargar” también conocido como “extract, transform, and load” o ETL (siglas en inglés). Por ejemplo, se puede usar para crear archivos de texto separados por coma CSV. Su principal uso es crear entidades de contenido en Drupal: nodos, usuarios, archivos, comentarios, etc. La API está muy bien documentada en inglés y sus mantenedores son muy activos en el canal #migration en slack para dar soporte a quien lo necesite. Los casos de uso para la API de migraciones son numerosos y varían mucho. Hoy comenzamos una serie de artículos que van a cubrir diferentes conceptos sobre migraciones para que puedas aplicarlos en tus propios proyectos.
Extraer, transformar y cargar (ETL) es un proceso donde datos se recolectan de diferentes fuentes, se procesan de acuerdo a las necesidades del negocio, y el resultado se almacena para uso futuro. Este paradigma no es exclusivo de Drupal. Libros y frameworks abundan sobre este tema. Para entender la idea general veamos esta analogía de la vida real: hornear pan. Para hacer pan, es necesario obtener varios ingredientes: harina de trigo, sal, levadura, etc. (extraer). Luego, necesitas combinarlos en un proceso que incluye mezcla y horneado (transformar). Finalmente, cuando el pan está listo, lo pones en estantes para exhibición en la panadería (cargar). En Drupal, cada paso es desempeñado por un plugin de migración:
Como es el caso con otros sistemas, el núcleo de Drupal ofrece funcionalidad básica que puede extenderse por módulos contribuidos o código personalizado. Por defecto, Drupal puede conectarse a bases de datos SQL incluyendo versiones previas de Drupal. Hay módulos contribuidos para leer archivos CSV, documentos XML, feeds JSON y SOAP, sitios de WordPress, hojas de cálculo de LibreOffice Calc y Microsoft Office Excel, hojas de cálculo de Google Sheets, y mucho más.
La lista de plugins de proceso disponibles por defecto es impresionante. Puedes concatenar cadenas, explotar o unir arreglos, encodear URLs, buscar datos previamente migrada, y otras operaciones de transformación. El módulo Migrate Plus provee aún más plugins de proceso para lectura de HTML, manipulación de DOM, reemplaza de cadenas de texto, transliteración, etc.
El núcleo de Drupal provee plugins de destino para entidades de contenido y configuración. La mayor parte del tiempo, el destino son entidades de contenido como nodos, usuarios, términos de taxonomía, comentarios, archivos, etc. También es posible importar entidades de configuración como definiciones de campos y tipos de contenido. Esto se usa con frecuencia cuando se actualizan sitios de Drupal 6/7 a Drupal 8/9. Utilizando una combinación de plugins de fuente, proceso y destino, es posible escribir Commerce Product Variations, Paragraphs y más.
Nota técnica: La API de Migraciones define otro tipo de plugin: `id_map`. Estos se usan para mapear los ID fuente a los ID destino. Esto permite al sistema llevar registro de los elementos que han sido importados y revertir la operación en caso de ser necesario.
Realizar una migración en Drupal es un proceso en dos etapas: escribir la definición de la migraciones y ejecutarlas. La definición de migraciones se escriben en formato YAML. Estos archivos contienen información sobre cómo extraer datos de una fuente, cómo procesar estos datos y cómo almacenarlos en el destino. Es importante aclarar que cada archivo de migración puede especificar solamente una fuente y un destino. Esto significa que no es posible leer de un archivo CSV y un feed JSON utilizando el mismo archivo de definición de migración. De forma similar, no es posible crear nodos y usuarios desde el mismo archivo. Sin embargo, es posible usar tantos plugins de proceso como sean necesarios para convertir los datos del formato definido en la fuente al formato esperado por el destino.
Un proyecto de migración típicamente incluye varios archivos de definición de migraciones. Aunque no es requerido, se recomienda escribir un archivo de migración por cada bundle de entidad. La razón es que diferentes tipos de contenido tiene diferentes configuraciones de campos. Es más fácil escribir y manejar migraciones cuando el destino es homogéneo. En este caso, un único tipo de contenido tendrá los mismos campos para todos los elementos a procesar en una migración particular.
Una vez que todas las definiciones de migraciones han sido escritas, es necesario ejecutarlas. La forma más común de hacer esto es usando el módulo Migrate Tools que provee comandos Drush y una interfaz de usuario (UI) para ejecutar migraciones. Cabe destacar que la interfaz para ejecutar migraciones sólo detecta aquellas que fueron definidas como entidades de configuración usando el módulo Migrate Plus. Este es un tema que se abordará en el futuro. Por ahora, vamos a utilizar los mecanismos provistos por el núcleo de Drupal para definir las migraciones. Módulos contribuidos como Migrate Scheduler, Migrate Manifest y Migrate Run proveen alternativas para ejecutar migraciones.
¿Sabías que la Drupal tiene un framework ETL incluido? ¿Conocías que hay plugins disponibles para extraer datos de tantas fuentes distintas? ¿Puedes pensar en un caso de uso donde el destino no sería la base de datos de Drupal? ¿Sabías que realizar una migración es un proceso en dos etapas? Favor comparte tus respuestas dejando un comentario. También te agradecemos compartas este artículo con tus amigos y colegas. Mañana vamos a aprender a escribir y ejecutar una migración básica.