Skip to content

aftern0on/atr_test

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Небольшое описание

Я захотел немного оптимизировать работу с БД так как по итогу скачивается около полумиллиона строк. Я решил использовать bulk-операции для пакетного помещения данных в БД в контексте транзакций. Пакет содержит 512 записей (можно поставить другое значение). Самое главное что я попытался минимизировать запросы к БД, хотя, очевидно, можно было бы придумать еще более мощное решение

Для поиска изменений при чтении .csv и внесении/обновлении данных в БД я использовал хеши (для них имеются отдельные индексированные столбцы для быстрого поиска) всей строки и КОД:ОТ:ДО, предполагая что код и диапазон номеров не будут меняться (разбиваться, сливаться), а меняться будут лишь операторы, их ИНН и регион. Таким образом, сначала идет поиск оператора по хешу значений КОД:ОТ:ДО, если не находится - создается новый оператор. Если нашелся - сравниваем хеш целой строки. Если не совпадает - значит произошли изменения, добавляем их в bulk-update очередь. Если без изменений - пропускаем.

Выглядит схема примерно так:

Поиск оператора по хешу (КОД:ОТ:ДО)
                |
        +-------+-------+
        |               |
    Найден?          Не найден
        |               |
        v               v
Сравнение хешей   Добавление в bulk-create
целой строки         очередь для создания
        |               
    Совпадает? ---------+
        |               |
        Да             Нет
        |               |
        v               v
    Пропускаем    Добавление в bulk-update
                    очередь для обновления

Инструкция:

  1. Скопировать проект: git clone https://github.com/aftern0on/atr_test/
  2. Развернуть при помощи docker: docker-compose up --build
  3. Если нужна админка (я добавил просмотр операторов), регестрируемся: 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/

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published