Импорт данных, миграция в Drupal

Миграция в Drupal

 

Эта статья является началом небольшого цикла (всего статей будет 3), посвященного проблеме импорта данных или миграции в Drupal. Называйте как Вам удобно. Итак, о чем же будем говорить в этом цикле:

  • предварительная подготовка данных к импорту. Структура исходной базы данных может мягко говоря не совсем нам подходить. Я приведу пример, и опишу как его решал (возможно Вы сможете предложить более оптимальное решение). Кстати, исходный сайт был на joomla!
  • применение модуля Table Wizard, для работы с таблицами, автоматического создания представления исходных данных (применяемое в дальнейшем для импорта)
  • использования модуля Migrate для импорта из подготовленного представления. Модуль Migrate позволяет сопоставить поля материала (ноды) полям в представлении, импортировать и обновлять созданные материалы.

Таким образом мы сможем импортировать данные из любой базы, любой cms. Различаться по трудоемкости будет лишь первая фаза. Фаза подготовки исходных данных.

Приступим. Передо мной стояла простая задача импорта данных из базы CMS Joomla! Со стандартными материалами обошлось без проблем. Таблица jos_content содержала все необходимые мне данные. Я перенес дамп таблицы в базу друпала, удалил ненужные строки и импортировал все остальные, сопоставив поля в настройках Migrate.

Сейчас рассмотрим более сложный случай. Требовалось импортировать тип материала, содержащий некоторое количество настраиваемых полей. С CMS Joomla! я практически не сталкивался и поэтому не могу сказать какой именно модуль производит такие работы, но видимо из целей уменьшения числа таблиц в базе, или по причине простоты разработки нормализация данных была нарушена. Структура на скрине:

То есть чтобы определить значения поля нужно знать itemid и fieldid. Значение поля содержится в data_txt, data_bool, data_int в зависимости о типа данных. Конечно таким образом мы получаем существенную экономию в размере таблиц (когда не все поля ноды обязательны), но, имхо, цена великовата + ограничение на тип данных.

Объем данных был достаточно велик и альтернативы обработке я не видел. Можно было в принципе реализовать программу, но хотелось найти более изящное решение. Вот решение:

  • создаем таблицу для хранения итоговых данных.
    CREATE TABLE IF NOT EXISTS `banks` (
    `id` bigint(20) unsigned NOT NULL,
    `address` text NOT NULL COMMENT '1',
    `email` text NOT NULL COMMENT '7',
    `www` text NOT NULL COMMENT '8',
    `phone` text NOT NULL COMMENT '10',
    `description` text NOT NULL COMMENT '13',
    `full_name` text NOT NULL COMMENT '16',
    `lic_num` text NOT NULL COMMENT '17',
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  • создаем строки, заполняя их значениями поля termid (id ноды в исходнйо базе).
    INSERT INTO banks(id)
    SELECT DISTINCT itemid as id
    FROM jos_sobi2_fields_data
  • заполняем данные. Просто ведь правда?

UPDATE banks SET

address = (SELECT CONCAT('Казань, ', data_txt)
FROM jos_sobi2_fields_data
WHERE (fieldid=1) AND (itemid=banks.id)),

email = (SELECT data_txt
FROM jos_sobi2_fields_data
WHERE (fieldid=7) AND (itemid=banks.id)),

www = (SELECT data_txt
FROM jos_sobi2_fields_data
WHERE (fieldid=8) AND (itemid=banks.id)),

phone = (SELECT data_txt
FROM jos_sobi2_fields_data
WHERE (fieldid=10) AND (itemid=banks.id)),

description = (SELECT data_txt
FROM jos_sobi2_fields_data
WHERE (fieldid=13) AND (itemid=banks.id)),

full_name = (SELECT data_txt
FROM jos_sobi2_fields_data
WHERE (fieldid=16) AND (itemid=banks.id)),

lic_num = (SELECT data_txt
FROM jos_sobi2_fields_data
WHERE (fieldid=17) AND (itemid=banks.id))
 

Позднее напишу о самом импорте с помощью модулей Table Wizard и Migrate.

Удачи!

З.Ы. Если у Вас имеется работающий сайт Joomla, возмодно Вам стоит смотреть в сторону записи выгрузки данных в промежуточный файл, с последующим использованием соответствующих модулей. Возможно это будет проще чем возиться с базой данных.

вернуться назад