Cómo migrar contenido de diferentes fuentes hacia Drupal utilizando el módulo Migrate

June 18, 2021

Tags: IT Staff ES 2024
Share

Table of contents

Quick Access

drupal

 

En algunas ocasiones, necesitamos migrar datos desde una fuente conocida a nuestro sitio en Drupal 7. Este proceso puede ser laborioso y llevar varias horas, especialmente si no se tiene experiencia con migraciones o con las distintas fuentes de datos posibles. Afortunadamente, el módulo Migrate de Drupal facilita enormemente esta tarea, proporcionando una interfaz sencilla y poderosa para gestionar la migración de datos.

 

En este artículo, veremos un ejemplo práctico de cómo migrar una tabla desde una base de datos a nuestro sitio Drupal para crear nodos de un tipo de contenido específico. Para este ejemplo, crearemos un tipo de contenido llamado Activities, que incluye un título, un cuerpo y una imagen.

 

Preparativos

Antes de comenzar, debemos tener claro qué datos necesitamos migrar. En este caso, migraremos los datos de la tabla activities de una base de datos externa.

 

Habilitar los módulos necesarios

Primero, habilitamos el módulo Migrate y el módulo Migrate UI (que nos proporciona una interfaz para gestionar las migraciones):

 
drush en migrate -y drush en migrate_ui -y 

 

Crear un módulo personalizado

A continuación, vamos a crear un módulo personalizado llamado migrate_activities. Este módulo dependerá del módulo Migrate y tendrá la siguiente estructura de archivos:

  1. migrate_activities.info
  2. migrate_activities.module
  3. activities.inc
  4. migrate_activities.migrate.inc

 

En el archivo migrate_activities.info, agregamos la dependencia al módulo Migrate:

 
dependencies[] = migrate 

 

Definir las migraciones

El archivo migrate_activities.migrate.inc se encargará de registrar la migración. Utilizamos el hook hook_migrate_api() para registrar los grupos de migración y las migraciones individuales. El código para el hook se ve de la siguiente manera:

 
/** * Implements hook_migrate_api(). */ function migrate_activities_migrate_api() {  $api = array(    'api' => 2,    'groups' => array(      'activities_group' => array(        'title' => t('Activity Migrations'),      ),    ),    'migrations' => array(      'activities' => array(        'class_name' => 'MigrateActivities',        'group_name' => 'activities_group',      ),    ),  );  return $api; } 

 

Definir la clase de migración

La clase MigrateActivities extiende la clase base Migration de Drupal y se define en el archivo activities.inc. Es importante incluir este archivo en el archivo migrate_activities.info como un archivo requerido:

 
files[] = 'activities.inc' 

 

La clase MigrateActivities se ve así:

 
/** * Class MigrateActivities */ class MigrateActivities extends Migration {  public function __construct($arguments) {    parent::__construct($arguments);  } } 

 

Establecer la fuente de datos

En el proceso de migración, necesitamos conectar a una base de datos externa y obtener los datos para la migración. Drupal ofrece varias fuentes para conectar con diferentes tipos de datos. En este caso, utilizamos MigrateSourceSQL para conectarnos a una base de datos SQL.

 

Primero, configuramos la conexión a la base de datos en el archivo settings.php de Drupal:

 
'migrate_db' => array(  'default' => array(    'database' => 'migrate',    'username' => 'root',    'password' => 'root',    'host' => 'localhost',    'port' => '',    'driver' => 'mysql',    'prefix' => '',  ), ), 

 

Ahora, podemos seguir editando la clase MigrateActivities y establecer la conexión y consulta SQL:

 
$query = Database::getConnection('default', 'migrate_db')  ->select('data', 'a')  ->fields('a', array('id', 'title', 'description', 'imageUrl')); $fields = array(  'id' => 'Unique ID for each source data row',  'title' => 'The activity title',  'description' => 'The activity description',  'imageUrl' => 'An image URL of the activity' ); $this->source = new MigrateSourceSQL($query, $fields); $this->destination = new MigrateDestinationNode('activities'); 

 

Mapear los campos

A continuación, mapeamos los campos de la fuente (base de datos) con los campos del destino (nodos en Drupal). Esto lo logramos utilizando la función addFieldMapping:

 
$this->map = new MigrateSQLMap($this->machineName, array(  'id' => array(    'type' => 'int',    'unsigned' => TRUE,    'not null' => TRUE,  ) ), MigrateDestinationNode::getKeySchema()); // Mapeo de los campos $this->addFieldMapping('title', 'title')  ->description(t('Mapping JSON object name in source to node title')); $this->addFieldMapping('body', 'description'); $this->addFieldMapping('field_activity_image', 'imageUrl'); 

 

Registrar la migración

Una vez que tengamos todo listo, habilitamos nuestro módulo y nos dirigimos a la interfaz de migración en:

 
admin/content/migrate/configure 

 

Hacemos clic en el botón Register statically defined classes para registrar nuestra migración. Ahora, en el panel de administración de migraciones (admin/content/migrate), veremos las migraciones disponibles.

 

Ejecutar la migración

En la tabla de migraciones, elegimos la opción de Import para iniciar el proceso de migración. Después de que el proceso termine, los datos de la tabla activities se habrán migrado a nodos de tipo Activities.

 

Ver los resultados

Para verificar que la migración se haya realizado correctamente, podemos crear una vista que muestre los resultados de los nodos migrados.

 

El módulo Migrate de Drupal es una herramienta poderosa que nos permite migrar datos desde diversas fuentes, como bases de datos SQL, CSV, XML, JSON, entre otros. Con la ayuda de este módulo, podemos crear nodos, usuarios, taxonomías y otras entidades en nuestro sitio Drupal, ahorrando horas de trabajo y facilitando el proceso de migración de contenidos.

 

Referencias:

 

Te recomendamos este video