Перенос данных из файла CSV в Drupal 8/9

Опубликовано: 2022-02-16

Процесс переноса данных в базу данных Drupal из CSV-файла можно выполнить с помощью встроенного в Drupal API Migrate и трех дополнительных настраиваемых модулей (Migrate Source CSV, Migrate Plus и Migrate Tools).

Это известно как процесс ETL (извлечение — преобразование — загрузка), в котором данные извлекаются из одного источника на первом этапе, преобразуются на втором этапе и, наконец, загружаются в место назначения в базе данных Drupal на третьем этапе.

В этом руководстве объясняется создание 12 книжных узлов для базы данных библиотеки. Продолжайте читать, чтобы узнать, как!

Перенос данных из файла CSV в Drupal 8/9

Шаг №1 - Установите Drush и необходимые модули

Для выполнения миграций в Drupal нам понадобится Drush. Drush — это не модуль Drupal, а интерфейс командной строки для выполнения команд Drupal. Чтобы установить последнюю версию Drush,

  • Откройте терминальное приложение вашей системы
  • Поместите курсор вне каталога /web .
  • Тип: композитор требует drush/drush

Это установит Drush в каталог vendor/bin/drush вашей установки Drupal. Однако вводить vendor/bin/drush вместо drush каждый раз, когда вы хотите выполнить команду drush, неудобно.

Средство запуска Drush позволяет запускать определенную версию Drush каждой установки Drupal для каждого проекта.

Почему это имеет смысл?

Каждый проект имеет разные требования, определенные версии Drush помогают избежать проблем с зависимостями. Некоторые модули contrib могут некорректно работать с последней версией Drush.

Конкретные инструкции для систем OSX и Windows можно найти здесь: https://github.com/drush-ops/drush-launcher#installation---phar

Для системы Linux:

  • Введите следующее, чтобы загрузить файл с именем drush.phar с GitHub:

wget -O drush.phar
https://github.com/drush-ops/drush-launcher/releases/latest/download/drush.phar

  • Введите следующее, чтобы сделать файл исполняемым: chmod +x drush.phar
  • Введите следующее, чтобы переместить файл .phar в $PATH и запустить Drush как глобальную команду: sudo mv drush.phar /usr/local/bin/ drush

Пришло время установить необходимые дополнительные модули для выполнения миграции.

  • Введите следующее:

composer require drupal/migrate_tools
composer require drupal/migrate_source_csv


Перенос данных из файла CSV в Drupal 8/9 Как только Composer завершит загрузку модулей,

  • Откройте бэкенд Drupal в браузере.
  • Нажмите Продлить
  • Включить Migrate , Migrate Plus , Migrate Tools и Migrate Source CSV
  • Нажмите Установить

Перенос данных из файла CSV в Drupal 8/9


Шаг № 2. Подробнее о процессе ETL

Процесс извлечения, преобразования и загрузки данных можно выполнить, указав миграцию в файле .yml, а затем выполнив ее с помощью команды Drush, чтобы можно было правильно заполнить базу данных Drupal.

Следует отметить несколько важных фактов:

  1. Каждый из шагов выполняется через плагины Drupal.
  2. Вам разрешено использовать только один плагин на первом этапе (определение источника, т.е. извлечение) и один плагин на последнем этапе (определение места назначения, т.е. загрузка) процесса.
    • Другими словами, вы можете получать данные только из одного источника (CSV-файл, канал JSON и т. д.) и хранить их в Drupal только под определенным набором сущностей, например, статьей, страницей, пользовательским типом контента, пользователем или объект конфигурации, а также.
  3. Вам разрешено использовать столько плагинов, сколько необходимо для моделирования данных, чтобы они соответствовали формату, ожидаемому Drupal.
  4. Drupal по умолчанию имеет список плагинов источника/процесса/назначения, которые можно использовать в файле определения.

Чтобы просмотреть список всех исходных плагинов,

  • Откройте окно терминала.
  • Введите следующее:

drush ev
"print_r(array_keys(\Drupal::service('plugin.manager.migrate.source')->getDefinitions()));"

Этот список немного длиннее, помните, что вы можете использовать столько плагинов, сколько вам нужно на этапе процесса.

Чтобы просмотреть список всех подключаемых модулей назначения,

  • Тип :

drush ev "print_r(array_keys(\Drupal::service('plugin.manager.migrate.destination')->getDefinitions()));"


"

Обратите внимание : плагин csv присутствует, потому что мы уже включили модуль Migrate Source CSV.

Чтобы просмотреть список всех подключаемых модулей процессов,

  • Введите следующее:

drush ev
"print_r(array_keys(\Drupal::service('plugin.manager.migrate.source')->getDefinitions()));"

Этот список немного длиннее, помните, что вы можете использовать столько плагинов, сколько вам нужно на этапе процесса.

Обратите внимание: плагин csv присутствует, потому что мы уже включили модуль Migrate Source CSV. Чтобы просмотреть список всех подключаемых модулей процессов, введите: drush ev "print_r(array_keys(\Drupal::service('plugin.manager.migrate.source')->getDefinitions()));" Этот список немного длиннее, помните, что вы можете использовать столько плагинов, сколько вам нужно на этапе процесса. Чтобы просмотреть список всех подключаемых модулей назначения, введите: drush ev "print_r(array_keys(\Drupal::service('plugin.manager.migrate.destination')->getDefinitions()));"

Чтобы просмотреть список всех подключаемых модулей назначения,

  • Введите следующее:

drush ev "print_r(array_keys(\Drupal::service('plugin.manager.migrate.destination')->getDefinitions()));"


Обратите внимание: плагин csv присутствует, потому что мы уже включили модуль Migrate Source CSV. Чтобы просмотреть список всех подключаемых модулей процессов, введите: drush ev "print_r(array_keys(\Drupal::service('plugin.manager.migrate.source')->getDefinitions()));" Этот список немного длиннее, помните, что вы можете использовать столько плагинов, сколько вам нужно на этапе процесса. Чтобы просмотреть список всех подключаемых модулей назначения, введите: drush ev "print_r(array_keys(\Drupal::service('plugin.manager.migrate.destination')->getDefinitions()));"

Шаг № 3 — Создайте тип контента

  • Щелкните Структура > Типы содержимого > Добавить тип содержимого.
  • Создайте тип контента «Книга»
  • Нажмите Сохранить и управлять полями.
  • Используйте строку заголовка CSV-файла для создания полей.

Я собираюсь объединить значения столбцов edition_number и editor, поэтому для этой цели мне нужно только одно поле в базе данных.

Примечание: имена полей (имена компьютеров) не обязательно должны точно совпадать с именами столбцов CSV-файла, но имеет смысл, по крайней мере, связать их похожими словами — это упрощает сопоставление полей на шаге процесса.

Перенос данных из файла CSV в Drupal 8/9

Поле заголовка является обязательным для каждого узла Drupal, поэтому нет необходимости создавать поле заголовка. Вы можете оставить поле тела нетронутым или удалить его, это зависит от того, что вы планируете делать с вашим конкретным типом контента.


Шаг № 4 — Файл определения миграции

Исходный шаг

  • Откройте предпочитаемый редактор кода
  • Введите следующее:

id: my_first_migration
label: Migrate terms from a CSV source
source:
plugin: csv
path: public://csv/library.csv
header_row_count: 1
ids:
[id]
delimiter: ';'
enclosure: "'"

Идентификатор файла соответствует его имени.

Мы используем плагин csv модуля contrib Migrate Source CSV в разделе исходного кода.

Число 1 в опции header_row_count указывает на значение заголовков столбцов (все они помещаются в первую строку).

Определение ids предоставляет уникальный идентификатор для каждой записи в CSV-файле, в данном случае это столбец id , имеющий тип integer . Не забудьте скобки, так как модуль ожидает здесь массив.

разделитель и вложение относятся к структуре CSV-файла, в моем конкретном случае он разделен символом «;» символов, тогда как строки заключаются в одинарные кавычки «'».

Перенос данных из файла CSV в Drupal 8/9

Обратите также внимание на определение пути. Именно туда вы должны поместить файл CSV, чтобы Drupal смог прочитать данные из него.

  • Откройте приложение терминала.
  • Тип :

mkdir web/sites/default/files/csv
cp /home/path/to/library.csv web/sites/default/files/csv/
chmod -R 777 web/sites/default/files/csv/

Это будет:

  1. создайте каталог с именем csv внутри общедоступной папки вашей установки Drupal.
  2. поместите копию файла CSV в этот каталог.
  3. сделать файл доступным для всех в системе (включая исходный плагин).

Шаг процесса

Здесь мы сопоставляем каждый из столбцов CSV-файла с полями в типе контента:

process:
title: title
field_id: id
field_author: author
field_location: location
field_availability: availability
field_editor:
plugin: concat
source:
- editor
- edition_number
delimiter: ' '
type:
plugin: default_value
default_value: book

Поле field_editor будет результатом объединения двух строк (значения внутри столбцов editor и edition_number ).
Первые 5 пар ключ/значение в форме drupal_machine_name: csv_column_name сопоставляют записи CSV с полями базы данных без внесения каких-либо изменений.

Опция разделителя позволяет установить разделитель между обеими строками, в данном случае пробел.

Плагин default_value помогает нам определить тип объекта, поскольку эта информация недоступна в исходных данных.

Шаг назначения

Заключительной частью этого процесса является шаг назначения.

destination:
plugin: entity:node

Мы переносим контент, и каждая запись будет узлом.


Шаг № 5 — Выполните миграцию

  • Щелкните Конфигурация > Синхронизация конфигурации > Импорт > Отдельный элемент.
  • Выберите « Миграция » в раскрывающемся списке.
  • Вставьте код из файла .yml в текстовое поле.
  • Нажмите Импорт

Перенос данных из файла CSV в Drupal 8/9

  • Нажмите Подтвердить, чтобы синхронизировать конфигурацию. Вы получите сообщение «Конфигурация успешно импортирована».
  • Перейдите в терминальное приложение.
  • Введите следующее:

drush migrate:import my_first_migration


Перенос данных из файла CSV в Drupal 8/9

Теперь вы можете проверить содержимое своего сайта.

Перенос данных из файла CSV в Drupal 8/9

Вы изучили основные принципы переноса данных из файла CSV в Drupal 8/9.

Как вы уже видели, процесс миграции требует внимания к деталям, поэтому сначала убедитесь, что вы работаете на промежуточном сервере, потому что одна маленькая ошибка может сломать весь сайт. Надеюсь, вам понравился этот урок.

Спасибо за чтение!