Импорт данных в параметры: технические детали¶
Для базовой информации и инструкций по UI см. статью для администратора.
Импорт из файлов (CSV, XLSX)¶
- Используется функция
import_dataиз модуляcore.parameters.libs.import_data. - Поддерживаются форматы CSV и XLSX.
- Файл должен содержать заголовки, соответствующие ключам измерений и мер параметра.
- Коды иерархии сопоставляются по shortname (кодам), а не по id.
Пример вызова:
from planiqum.core.parameters.libs.import_data import import_data
import_data(data="facts.csv", parameter="demand_plan_tech_week")
Пример с запуском триггеров:
import_data(data="facts.csv", parameter="demand_plan_tech_week", execute_triggers=True)
Импорт из pandas.DataFrame¶
- Можно передать напрямую объект
pandas.DataFrameвместо файла. - Это удобно для генерации или трансформации данных программно.
Пример:
import pandas as pd
from planiqum.core.parameters.libs.import_data import import_data
df = pd.DataFrame([
{"activity": "BASE", "dpu": "DPU1", "horizon__tech_week": "2024-01-W01", "value": 100},
{"activity": "BASE", "dpu": "DPU2", "horizon__tech_week": "2024-01-W01", "value": 200},
])
import_data(data=df, parameter="demand_plan_tech_week")
Внимание: В будущем рекомендуется переходить к импорту через чистый SQL и загрузку из CSV-файлов для повышения производительности и отказа от промежуточных DataFrame.
Техническая реализация¶
- Основная функция:
import_dataиз модуляcore.parameters.libs.import_data - Определяет формат файла, преобразует в DataFrame (если нужно).
- Сопоставляет коды иерархии с внутренними id через mapping.
- Валидирует структуру и значения.
- Записывает данные в таблицу фактов через ORM и bulk-операции.
- При
execute_triggers=Trueзапускает связанные триггеры после успешного импорта. -
В случае ошибок формирует подробный отчёт (ImportResult).
-
Вспомогательные функции:
df_to_facts— преобразует DataFrame в структуру для записи фактов.import_df— выполняет запись фактов в базу.-
get_df— универсальный загрузчик данных из файла/DataFrame. -
Все операции логируются, результаты фиксируются в журнале импортов (модель ImportResult).
Запуск триггеров при импорте¶
- Параметр
execute_triggers(по умолчаниюFalse) позволяет запускать связанные триггеры после успешного импорта данных. - Триггеры выполняются для всех мер параметра, которые имеют связанные триггеры с
auto_run=True. - Выполнение триггеров происходит после записи данных, но до финального сохранения изменений.
- Используется тот же механизм, что и при корректировке данных через
fact_manager.run_scripts(). - Параметр
trigger_modeпозволяет выбрать режим запуска триггеров: 'facts'- запуск триггеров от фактов (перебирает каждое измененное измерение отдельно)'revision'- запуск триггеров от ревизий (собирает все измененные измерения в набор)None(по умолчанию) - использует системную настройкуTRIGGER_BY_FACTS
Примеры использования:
# Импорт без триггеров (по умолчанию)
import_data(data="facts.csv", parameter="demand_plan_tech_week")
# Импорт с запуском триггеров (использует системную настройку)
import_data(data="facts.csv", parameter="demand_plan_tech_week", execute_triggers=True)
# Импорт с триггерами от фактов
import_data(data="facts.csv", parameter="demand_plan_tech_week", execute_triggers=True, trigger_mode='facts')
# Импорт с триггерами от ревизий
import_data(data="facts.csv", parameter="demand_plan_tech_week", execute_triggers=True, trigger_mode='revision')
Management команда:
# Импорт без триггеров
python manage.py import_data parameter_key file.csv
# Импорт с триггерами (использует системную настройку)
python manage.py import_data parameter_key file.csv --execute-triggers
# Импорт с триггерами от фактов
python manage.py import_data parameter_key file.csv --execute-triggers --trigger-mode facts
# Импорт с триггерами от ревизий
python manage.py import_data parameter_key file.csv --execute-triggers --trigger-mode revision
Алгоритмы и структуры данных¶
- Для сопоставления кодов используется DataFrame с mapping-таблицами по каждому измерению.
- Bulk-операции выполняются через pandas и Django ORM.
- Ошибки и некорректные строки не блокируют импорт остальных данных (если не задано строгое поведение).
Примеры кода¶
Импорт из файла:
import_data(data="facts.xlsx", parameter="demand_plan_tech_week", source_file_type="xlsx")
Импорт из DataFrame:
import_data(data=df, parameter="demand_plan_tech_week")
Импорт с триггерами:
# Использует системную настройку TRIGGER_BY_FACTS
import_data(data="facts.csv", parameter="demand_plan_tech_week", execute_triggers=True)
# Принудительно использует режим от фактов
import_data(data="facts.csv", parameter="demand_plan_tech_week", execute_triggers=True, trigger_mode='facts')
# Принудительно использует режим от ревизий
import_data(data="facts.csv", parameter="demand_plan_tech_week", execute_triggers=True, trigger_mode='revision')
Импорт с дополнительными параметрами:
import_data(
data="facts.csv",
parameter="demand_plan_tech_week",
execute_triggers=True,
ignore_errors=True,
flush=False
)
Ограничения и best practices¶
- Не используйте DataFrame для больших объёмов данных — переходите на SQL и прямой импорт из CSV.
- Всегда проверяйте структуру файла и коды иерархии перед импортом.
- Для тестов и отладки используйте отдельные приложения с тестовыми данными.
- Используйте
execute_triggers=Trueтолько когда необходимо автоматически обновить связанные данные после импорта. - Триггеры могут значительно увеличить время выполнения импорта, особенно для больших объёмов данных.
Ссылки¶
- Документация для администратора по импорту данных
- Исходный код функции
import_dataнаходится в модулеcore.parameters.libs.import_data