# Импорт/Экспорт

# Введение

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

Даже после этого импорт может ежедневно использоваться для загрузки оперативных данных из других систем компании, таких как ERP (opens new window) и других.

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

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

Для решения этой проблемы мы предлагаем использовать продукт, которые зарекомендовал себя годами работы в различных компаниях и который совершенно бесплатен - Talend Open Studio (opens new window).

Это ETL tool (opens new window), который позволяет извлекать данные из различных источников, преобразовывать их и далее записывать также в различных видах и форматах.

Мы создали интеграцию с этим средством чтобы было возможно с его помощью выгружать и загружать данные в систему. Это позволяет использовать всю мощь Talend по преобразованию полученных данных. В результате, вы можете импортировать и экспортировать данные из/в любых файлов (CSV, XML, Text и т.д.) и также из/в любых баз данных.

Вы можете более подробно ознакомиться с возможностями Talend Open Studio в этой статье (opens new window).

Также вам доступно Руководство по использованию Talend на русском языке (opens new window)

# Начало работы

  1. Для начала вам необходимо установить саму Talend Open Studio и Java (необходима для работы Talend).

  2. Затем вам необходимо скачать компоненты для интеграции нашей системы и Talend: pim-components.car (opens new window).

  3. И наконец, вам необходимо выполнить команду:

java -jar pim-components.car studio-deploy <КАТАЛОГ КУДА УСТАНОВЛЕН Talend>
  1. При первом запуске Talend может запросить следующие дополнительные компоненты:

Вам будет необходимо скачать их и указать путь на скаченные файлы в диалоговом окне Talend.

В результате будут установлены наши компоненты, и они появятся в палитре доступных компонентов в Talend:

# Импорт

Мы предоставляем 2 компонента для импорта данных в систему:

  • PIMOutput - для загрузки данных о продуктах и их зависимостях
  • PIMAssetUpload - для загрузки файлов

# PIMOutput

PIMOutput используется для записи данных о продуктах и их зависимостях в систему. Также поддерживается запись самой модели данных, то есть таких объектов как типы, атрибуты, зависимости и т.д.

Для записи данных вам необходимо вызвать этот компонент и передать ему набор данных в виде колонок с соответствующими названиями. Каждое название колонки отражает в какой атрибут будут записаны данные.

Для продуктов поддерживаются следующие колонки:

  • identifier - Идентификатор продукта (должен быть на английском языке и не должен содержать пробелы)
  • typeIdentifier - Идентификатор типа. Будет создан объект этого типа.
  • parentIdentifier - Идентификатор родительского объекта. Новый объект будет создан под этим родителем, либо будет создан объект первого уровня если эта колонка не задана.

Этот набор колонок минимально необходим чтобы создать новый объект. Доступны также следующие колонки:

  • name_<идентификатор языка> - Это название объекта. Вы можете иметь несколько колонок таких как, name_ru, name_en и т.д для разных языков.
  • attr_<идентификатор атрибута> или attr_<идентификатор атрибута>_<идентификатор языка> - значение конкретного атрибута. Вам необходимо задать идентификатор атрибута чтобы данные записались именно в него. Если этот атрибут зависит от языка то вам еще дополнительно необходимо задать идентификатор языка в которых необходимо записать данные. Например, если у вас есть атрибут description и он зависит от языка, то вам необходимо иметь колонку с названием attr_description_ru чтобы записать в него данные.

Для зависимостей между продуктами поддерживаются следующие колонки:

  • identifier - Идентификатор зависимости (должен быть на английском языке и не должен содержать пробелы)
  • relationIdentifier - Идентификатор типа зависимости. Будет создана зависимость этого типа.
  • itemIdentifier - Идентификатор исходного объекта. Зависимость будет начинаться от этого объекта.
  • targetIdentifier - Идентификатор конечного объекта. Зависимость будет заканчиваться на этом объекте.

Этот набор колонок минимально необходим чтобы создать новую зависимость. Доступны также следующие колонки:

  • attr_<идентификатор атрибута> или attr_<идентификатор атрибута>_<идентификатор языка> - значение конкретного атрибута. Вам необходимо задать идентификатор атрибута чтобы данные записались именно в него. Если этот атрибут зависит от языка то вам еще дополнительно необходимо задать идентификатор языка в которых необходимо записать данные. Например, если у вас есть атрибут description и он зависит от языка, то вам необходимо иметь колонку с названием attr_description_ru чтобы записать в него данные.

Для конфигурации самого компонента вам необходимо задать:

  • url - путь к вашему серверу (каждой компании выдается свой путь)
  • username - имя пользователя, под которым будет производиться запись
  • password - пароль этого пользователя
  • entity - Куда записывать данные, доступны следующие опции: Item - объект, Item Relation - зависимости объекта, Type - тип, Attribute - атрибут, Atribute Group - группа атрибутов, Relation - зависимость, User - пользователь, Role - Роль, List of values - список значений
  • Import mode - режим работы импорта: CREATE_UPDATE - если объект с данным идентификатором найден, то он будет обновлен, иначе создан, CREATE_ONLY - если объект с данным идентификатором найден то возникнет ошибка, иначе он будет создан, UPDATE_ONLY - если объект с данным идентификатором найден то он будет обновлен, иначе возникнет ошибка
  • Errors processing - как реагировать на ошибки: PROCESS_WARN - возникающие предупреждения не будут останавливать импорт и объект будет создан или обновлен, WARN_REJECTED - в случае предупреждений объект не будет изменен.
  • Show debug output - Если эта опция выбрана, то система будет выводить дополнительную отладочную информацию во время работы.

TIP

Этот компонент имеет 2 выхода. Если запись обработана нормально, то она попадет в основной выход, иначе в ошибочный выход. Таким образом вы можете отфильтровать все ошибочные записи.

# PIMAssetUpload

PIMAssetUpload служит для загрузки файлов в систему.

Важно: PIMAssetUpload может загрузить файл только в существующий объект, то есть необходимо сперва создать объект (вручную через систему или через PIMOutput) и только потом загружать в него файл.

PIMAssetUpload требует на вход 2 колонки:

  • id - внутренний идентификатор объекта, это не Identifier, его можно увидеть в интерфейсе системы или получить через PIMInput или PIMRowInput
  • file - полный путь к файлу, который будет загружен.

Для конфигурации самого компонента вам необходимо задать:

  • url - путь к вашему серверу (каждой компании выдается свой путь)
  • username - имя пользователя, под которым будет производиться запись
  • password - пароль этого пользователя
  • Show debug output - Если эта опция выбрана, то система будет выводить дополнительную отладочную информацию во время работы.

TIP

Этот компонент имеет 2 выхода. Если запись обработана нормально, то она попадет в основной выход, иначе в ошибочный выход. Таким образом вы можете отфильтровать все ошибочные записи.

# Экспорт

Мы предоставляем 3 компонента для экспорта данных из системы:

  • PIMInput - для выгрузки данных о продуктах и их зависимостях
  • PIMRowInput - этот компонент похож на PIMInput но имеет расширенные возможности по выборке данных
  • PIMAssetDownload - для выгрузки файлов

# PIMInput

PIMInput позволяет выбрать объекты по заданному критерию и экспортировать их из системы. Поддерживаются как объекты и их зависимости, так и экспорт модели данных.

Компонент имеет следующие опции:

  • url - путь к вашему серверу (каждой компании выдается свой путь)
  • username - имя пользователя, под которым будет производиться запись
  • password - пароль этого пользователя
  • entity - Какие данные экспортировать, доступны следующие опции: Item - объект, Item Relation - зависимости объекта, Type - тип, Attribute - атрибут, Atribute Group - группа атрибутов, Relation - зависимость, User - пользователь, Role - Роль, List of values - список значений
  • where - какие именно данные вы хотите экспортировать. Формат запроса описан в разделе "Язык запросов"
  • order - в каком порядке делать экспорт
  • page size - сколько записей получать за один запрос к серверу. Это может влиять на производительность экспорта, если вы выгружаете много данных, то небольшое значение этого параметра приведет к увеличению количества запросов и соответственно к большему времени работы.
  • Show debug output - Если эта опция выбрана, то система будет выводить дополнительную отладочную информацию во время работы.

Этот компонент запрашивает данные и выдает их в соответствующих колонках. Для объектов поддерживаются следующие колонки:

  • identifier - Идентификатор объекта.
  • id - внутренний идентификатор объекта
  • typeIdentifier - Идентификатор типа объекта.
  • typeId - Внутненний идентификатор типа объекта.
  • parentIdentifier - Идентификатор родительского объекта.
  • name_<идентификатор языка> - Это название объекта. Вы можете иметь несколько колонок таких как, name_ru, name_en и т.д для разных языков.
  • attr_<идентификатор атрибута> или attr_<идентификатор атрибута>_<идентификатор языка> - значение конкретного атрибута. Если атрибут зависит от языка, то для каждого языка будет свое значение (колонка). Например, если у вас есть атрибут description и он зависит от языка то вам будут доступны колонки с названиеми attr_description_ru и attr_description_en для русского и английского языка соответственно.
  • createdAt - время создания объекта
  • createdBy - кто создал объект
  • updatedAt - время последней модификации объекта
  • updatedBy - кто последний модифицировал объект

Для зависимостей между продуктами поддерживаются следующие колонки:

  • identifier - Идентификатор зависимости
  • id - Внутренний идентификатор зависимости
  • relationIdentifier - Идентификатор типа зависимости.
  • relationId - Внутренний идентификатор типа зависимости.
  • itemIdentifier - Идентификатор исходного объекта.
  • itemId - Внутренний идентификатор исходного объекта.
  • targetIdentifier - Идентификатор конечного объекта.
  • targetId - Внутренний идентификатор конечного объекта.
  • attr_<идентификатор атрибута> или attr_<идентификатор атрибута>_<идентификатор языка> - значение конкретного атрибута. Если атрибут зависит от языка, то для каждого языка будет свое значение (колонка). Например, если у вас есть атрибут description и он зависит от языка то вам будут доступны колонки с названиеми attr_description_ru и attr_description_en для русского и английского языка соответственно.
  • createdAt - время создания зависимости
  • createdBy - кто создал зависимость
  • updatedAt - время последней модификации зависимости
  • updatedBy - кто последний модифицировал зависимость

# PIMRowInput

PIMInput это начальный компонент, то есть он должен находиться вначале Job в Talend. Но, что, если у вас есть, например, список идентификаторов товаров в файле и вы хотите выгрузить только их и не выгружать другие записи? В этом случае вы не можете использовать PIMInput так как вы не сможете написать такой запрос в нем, который отфильтрует записи по вашему списку.

Для решения этой задачи вам необходимо использовать PIMRowInput. Он очень похож на PIMInput но он не начальный компонент и не обязательно должен быть первым. При этом он еще умеет брать значения из входящих колонок для того, чтобы сформировать нужный запрос.

В этом случае, мы читаем список идентификаторов их файла в колонку identifier (это происходит в tFileInputXML_1), затем мы вызываем PIMRowInput и делаем запрос {identifier: "#[identifier]"}. Это означает что необходимо найти объект с идентификатором #[identifier]. Но так как мы используем PIMRowInput то он трансформирует этот запрос. Для каждой записи что мы прочитали из файла он вызывает запрос в систему и вместо #[identifier] подставляется реальное значение из колонки identifier. Например, если у нас в файле есть 2 идентификатора: 111 и 222, то в систему будут отправлены следующие запросы:

  1. {identifier: "111"}
  2. {identifier: "222"}

То есть PIMRowInput заменяет #[<название колонки>] на реальное значение в этой колонке. В результате, мы может делать запросы, которые зависят от переданных данных. Это невозможно сделать с просто PIMInput.

Все остальные опции этого компонента аналогичны компоненту PIMInput.

# PIMAssetDownload

Этот компонент служит для экспорта файлов из системы.

На вход он требует 2 колонки: id и file. Для каждой входящей записи будет найдет объект по заданному внутреннему идентификатору id и записан в файл по пути, заданному в колонке file.

Компонент имеет следующие опции:

  • url - путь к вашему серверу (каждой компании выдается свой путь)
  • username - имя пользователя под которым будет производиться запись
  • password - пароль этого пользователя
  • Show debug output - Если эта опция выбрана то система будет выводить дополнительную отладочную информацию во время работы.

Этот компонент имеет 2 выхода. Если файл выгружен нормально то она попадет в основной выход, иначе в ошибочный выход. Таким образом вы можете отфильтровать все ошибочные записи.