Миграция данных из CSV

SELECT
    'external_id', 
    'full_name',
    'first_name',
    'middle_name',
    'last_name',
    'org',
    'title',
    'description',
    'avatar_path',
    'source',
    'emails',
    'phone_numbers',
    'phone_description',
    'phone_types'
UNION ALL
SELECT
    contact.uuid, 
    contact.contact_name,
    contact.first_name,
    contact.middle_name,
    contact.last_name,
    contact.company,
    contact.position,
    contact.description,
    contact.photo,
    source.domain,
    IFNULL((SELECT GROUP_CONCAT(DISTINCT email.email ORDER BY email.email SEPARATOR ',') FROM email WHERE email.contact_id = contact.id), ''),
    IFNULL((SELECT GROUP_CONCAT(DISTINCT phone.digits ORDER BY phone.digits SEPARATOR ',') FROM phone WHERE phone.contact_id = contact.id), ''),
    IFNULL((SELECT GROUP_CONCAT(DISTINCT phone.description ORDER BY phone.description SEPARATOR ',') FROM phone WHERE phone.contact_id = contact.id), ''),
    IFNULL((SELECT GROUP_CONCAT(DISTINCT label.name ORDER BY label.name SEPARATOR ',') FROM label INNER JOIN phone ON label.id = phone.label_id WHERE phone.contact_id = contact.id), '')
INTO OUTFILE '/var/lib/mysql-files/your_file.csv'
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM contact
LEFT JOIN source ON source.id = contact.source_id
GROUP BY contact.id;


Название CSV файла не должно содержать кириллические символы и точки. Также файл должен иметь расширение .csv.

Чтобы сервис мог увидеть данный файл, необходимо поместить его по следующему пути:

/var/lib/docker/volumes/address-book-stable_csv_data_volume/_data/



Имя файла влияет на источник контакта. Например, для файла с именем valid_format.csv, источник (source) будет указан как csv.valid_format. В имени файла допускаются только латинские буквы и цифры, все остальные символы заменяются на нижнее подчеркивание.


Для того, чтобы импортировать данные из CSV:

1. Отредактируйте файл settings.override.yaml:

<nano/vim/mcedit> address-book/stable/settings.override.yaml

 Заполните значения полей в соответствии с вашей инфраструктурой и соблюдая структуру YAML:

sources:  #Здесь задаются источники откуда брать данные
  csv:
    base_ou: "Имя компании"
# ============================
# ОБЩИЕ НАСТРОЙКИ
# ============================

additional_import_settings:
  common:
    include_incompletely_filled_contacts: false # | true   - если выключена, при импорте будут отброшены все контакты, у которых отсутствуют обязательные поля

    full_name_parsing:
      enabled: false
      pattern: "LFM" # L - last_name, M - middle_name, F - first_name
      fallback_enabled: true # если не удалось распарсить - класть всё в fallback_field
      fallback_field: "middle_name" # middle_name | first_name | last_name; по умолчанию middle_name

  csv:
    ignore_data: ["\\N", ""]



Множественный импорт для csv не поддерживается.

2. При необходимости поменяйте настройки маппинга, указав в секции mappers:

# ============================
# КОНФИГУРАЦИЯ МАППИНГА
# ============================

# Конфигурация мапперов для трансформации данных из внешних источников в структуру контакта Address Book
#
# Доступные поля контакта: domain, external_id, birthday, common_name, first_name,
# last_name, middle_name, nickname, org, title, full_name, position, gender, avatar, addresses, emails, messengers,
# phones, additional_info
#
# Структура маппера:
#   <источник>:
#     <поле_контакта>: [<путь_к_данным_в_источнике>, <тип_данных>]
#     <поле_контакта>: [[<вложенный_путь>, <тип_данных>]]
#     additional_info:
#       <подполе>: [<путь_к_данным>, <тип_данных>]
#
# Поддерживаемые типы данных:
#   - string: строковые значения
#   - url: тип аватара; означает, что аватар хранится в виде пути
#   - jpeg: тип аватара; бинарные данные изображений
#   - email: адреса электронной почты
#   - phone: номера телефонов
#   - date: даты
#
# Особенности:
#   - Поле 'kind' автоматически устанавливается сервисом ('contact' или 'group')
#   - Поле 'additional_info' поддерживает только одноуровневую вложенность
#   - Вложенные структуры в 'additional_info' отбрасываются с записью в лог
#   - Для полей emails, phones, avatar поддерживается множественное отображение

mappers:
  csv:
    external_id: ["external_id", "string"]
    full_name: ["full_name", "string"]
    first_name: ["first_name", "string"]
    middle_name: ["middle_name", "string"]
    last_name: ["last_name", "string"]
    org: ["org", "string"]
    title: ["title", "string"]
    avatar: ["avatar_path", "url"]
    source: ["source", "string"]
    emails: ["emails", ["email", "work"]]
    phones: ["phone_numbers", ["phone", "work"]]


3. Подключитесь к docker-контейнеру сервиса Address Book:

docker exec -it address-book-stable-server-1 bash

4. Подключитесь к Erlang node по имени:

./ecss_address_book remote --name ecss_address_book

5. Выполните команду для запуска миграции LDAP:

EcssAddressBookCore.Actions.CsvImport.import("/home/csv_data/your_file.csv")

Для базовой проверки полноты миграции можно обратиться напрямую к БД с запросом количества контактов:

EcssAddressBookDb.Actions.Contacts.count(%{})
{:ok, 1337}

Число после :ok должно совпадать с количеством контактов CSV.

Для выхода из iex нажмите Ctrl+C дважды. Затем введите exit.