Upload
volodymyr-maykher
View
310
Download
1
Embed Size (px)
Citation preview
Migrate API Drupal 7/8 1
Майхер Володимир
EPAM Systems
Модуль migrate
2
Переваги модуля migrate:
• Будь-яке джерело даних (SQL, XML, JSON, CSV)
• Можливість корегувати дані при міграції
• Можливість зробити rollback після імпорту
• Статистика по кожній міграції
• Можливість вказувати залежність міграцій одна від одної
• Інтеграція з drush
• Міграція підчас інсталяції
3
Архітектура модуля migrate:
• MigrateSource
• MigrateDestination
• MigrateMap
• MigrateFieldMapping
4
Архітектура модуля migrate:5
Запуск міграції:
6Migrate в Drupal 7
• Migrate_ui
• drush
7migrate_ui
8migrate_ui
migrate_ui 9
migrate_ui 10
migrate_ui 11
drush команди
drush migrate-fields-destination (mfd)
drush migrate-fields-source (mfs)
drush migrate-import (mi)
drush migrate-mappings (mm)
drush migrate-messages (mmsg)
drush migrate-reset-status (mrs)
drush migrate-rollback (mr)
drush migrate-status (ms)
drush migrate-stop (mst)
drush migrate-analyze (maz)
drush migrate-audit (ma)
drush migrate-register (mreg)
drush migrate-deregister
drush migrate-wipe (mw)
12
drush опції
--all
--idlist
--instrument
--limit
--stop
--update
13
Приклади використання з drush
• drush migrate-import BrandTerm – виконання міграції з машинною назвою “BrandTerm”
• drush migrate-import BrandTerm --update – імпортує нові елементи і оновлює існуючі
• drush migrate-import BrandTerm --idlist=4,9 – імпорт двох окремих елементів з id = 4 та id
= 9. Id беруться з таблиці мапінгу.
Більше на https://www.drupal.org/node/1561820.
14
Як створити міграцію? 15
galauto_migrate.module
galauto_migrate.migrate.inc
У файлі galauto_migrate.info
вказуємо звичну інформацію.
<?php
/**
* @file
* THIS SPACE INTENTIONALLY LEFT BLANK.
*/
<?php
/**
* Implements hook_migrate_api().
*/
function galauto_migrate_migrate_api() {
$api = array(
'api' => 2,
'migrations' => array(
'BrandTerm' => array('class_name' => 'BrandTermMigration'),
),
);
return $api;
}
Як створити міграцію? 16
brand.inc
<?php
class BrandTermMigration extends Migration {
public function __construct() {
parent::__construct();
Об`являємо клас
Як створити міграцію? 17
brand.inc Source об`єкт
$query = db_select('car_mark', 'mark')
->fields('mark', array('id_car_mark', 'name'));
$this->source = new MigrateSourceSQL($query);
Як створити міграцію? 18
brand.inc Source об`єкт
Source класи: • MigrateSourceSQL
• MigrateSourceList
• MigrateSourceMultiitems
• MigrateSourceXML
• MigrateSourceCSV
• MigrateSourceMSSQL
• MigrateSourceOracle
• MigrateSourceMongoDB
• MigrateListJSON and MigrateItemJSON
• MigrateListFile and MigrateItemFile
Як створити міграцію? 19
brand.inc Destination об`єкт
Destination класи: • MigrateDestinationRole
• MigrateDestinationUser
• MigrateDestinationTerm
• MigrateDestinationNode
• MigrateDestinationComment
• MigrateDestinationFile
• MigrateDestinationNodeRevision
• MigrateDestinationTable
$this->destination = new MigrateDestinationTerm('brands');
Як створити міграцію? 20
brand.inc Об`єкт мапінгу
Клас мапінгу: • MigrateSQLMap
$source_key_schema = array(
'id_car_mark' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
)
);
$this->map = new MigrateSQLMap($this->machineName, $source_key_schema,
MigrateDestinationTerm::getKeySchema());
Як створити міграцію? 21
brand.inc Мапінг полів
$this->addFieldMapping('name', 'name')
->description(t('The incoming name(source) field is the name of the term'));
$this->addFieldMapping('format')
->issueGroup(t('DNM'));
$this->addFieldMapping('weight')
->issueGroup(t('DNM'));
Як створити міграцію?
<?php
class BrandMigration extends Migration {
public function __construct() {
parent::__construct();
$this->description = t('Migrate car brands from the source database to taxonomy terms');
$source_key_schema = array(
'id_car_mark' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
)
);
$this->map = new MigrateSQLMap($this->machineName, $source_key_schema,
MigrateDestinationTerm::getKeySchema());
$query = db_select('car_mark', 'mark')
->fields('mark', array('id_car_mark', 'name'))
$this->source = new MigrateSourceSQL($query);
$this->destination = new MigrateDestinationTerm('brands');
$this->addFieldMapping('name', 'name')
->description(t('The incoming name(source) field is the name of the term parent'));
$this->addFieldMapping('description')
->issueGroup(t('DNM'));
}
}
22
brand.inc
Додаткові методи 23
brand.inc
• function prepareRow($row)
• function prepare($entity, stdClass $row)
• function complete($entity, stdClass $row)
Migrate в Drupal 8 24
• Migrate
• Migrate Drupal
25Міграція в ядрі
• Для міграції Drupal 6 → Drupal 8 можна використати модуль upgrade або drush
• для інших лише drush
26Як запустити міграцію?
Містить плагіни для міграції основних компонентів Drupal 6/7, таких як, контент типи,
поля, користувачі, ноди, таксономія та інші.
27Migrate Drupal
Лише Drupal 6 на даний момент
Для написання міграції обов`язково створити файли:
28Migrating from Drupal 7
Migrating from Drupal 7 29
migrate.migration.custom_user.yml
Migrating from Drupal 7 30
User.php
Migrating from Drupal 7 31
manifest.yml
Для запуску міграції в консолі пишемо:
drush migrate-manifest <manifest-name> --legacy-db-url=mysql://<username>:<password>@<host>:<portno>/<db_name>
drush migrate-manifest manifest.yml --legacy-db-url=mysql://root:root@localhost/drupal7
Має знаходитись в корені Drupal
- custom_user
32Запитання?