Я захотел немного оптимизировать работу с БД так как по итогу скачивается около полумиллиона строк. Я решил использовать bulk-операции для пакетного помещения данных в БД в контексте транзакций. Пакет содержит 512 записей (можно поставить другое значение). Самое главное что я попытался минимизировать запросы к БД, хотя, очевидно, можно было бы придумать еще более мощное решение
Для поиска изменений при чтении .csv и внесении/обновлении данных в БД я использовал хеши (для них имеются отдельные индексированные столбцы для быстрого поиска) всей строки и КОД:ОТ:ДО, предполагая что код и диапазон номеров не будут меняться (разбиваться, сливаться), а меняться будут лишь операторы, их ИНН и регион. Таким образом, сначала идет поиск оператора по хешу значений КОД:ОТ:ДО, если не находится - создается новый оператор. Если нашелся - сравниваем хеш целой строки. Если не совпадает - значит произошли изменения, добавляем их в bulk-update очередь. Если без изменений - пропускаем.
Выглядит схема примерно так:
Поиск оператора по хешу (КОД:ОТ:ДО)
|
+-------+-------+
| |
Найден? Не найден
| |
v v
Сравнение хешей Добавление в bulk-create
целой строки очередь для создания
|
Совпадает? ---------+
| |
Да Нет
| |
v v
Пропускаем Добавление в bulk-update
очередь для обновления
- Скопировать проект:
git clone https://github.com/aftern0on/atr_test/
- Развернуть при помощи docker:
docker-compose up --build
- Если нужна админка (я добавил просмотр операторов), регестрируемся:
docker exec -it <web_container_id> python manage.py createsuperuser
, переходим поhttp://127.0.0.1:8000/admin/
- Чтобы не ждать celery-таск весь день, можно выполнить загрузку/обновление операторов выполнив POST-запрос по эндпойнту:
http://127.0.0.1:8000/api/update_operators/
- Чтобы получить данные по телефону по API, отправляем POST-запрос с raw-JSON типа {"phone": "79000000000"} по:
http://127.0.0.1:8000/api/check_phone/
- Чтобы воспользоваться формой для получения информации о телефоне, перейти по
http://127.0.0.1:8000/api/check_phone_form/