{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Дима пишет | Дмитрий Смотров: заметки с тегом DataWarehouse",
    "_rss_description": "backend python fastapi django rabbitmq kafka postgresql sqlalchemy",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/dimasmotrov.ru\/tags\/datawarehouse\/",
    "feed_url": "https:\/\/dimasmotrov.ru\/tags\/datawarehouse\/json\/",
    "icon": "https:\/\/dimasmotrov.ru\/pictures\/userpic\/userpic@2x.jpg?1718470292",
    "authors": [
        {
            "name": "Дима Смотров",
            "url": "https:\/\/dimasmotrov.ru\/",
            "avatar": "https:\/\/dimasmotrov.ru\/pictures\/userpic\/userpic@2x.jpg?1718470292"
        }
    ],
    "items": [
        {
            "id": "39",
            "url": "https:\/\/dimasmotrov.ru\/all\/probilsya-na-habr\/",
            "title": "Пробился на хабр",
            "content_html": "<p>Написал свою первую статью на хабре, посвященную техническим аспектом из <a href=\"https:\/\/dimasmotrov.ru\/all\/ya-tut-proekt-pod-klyuch-realizoval\/\">поста<\/a> про реализованную мной функциональность красивой работы с данными.<\/p>\n<p>Прикольный опыт редактора более менее серьезного материала. Текст старался держать больше в литературном стиле, нежели в сухом техническом, так что читаться будет легко.<\/p>\n<p>Почитать можно тут — <a href=\"https:\/\/habr.com\/ru\/companies\/astralinux\/articles\/972328\/\">https:\/\/habr.com\/ru\/companies\/astralinux\/articles\/972328\/<\/a> . Там как раз есть пара спорных моментов, на мой взгляд, с удовольствием подхвачу накидывание на вентилятор. Так что задавайте ваши вопросы :)<\/p>\n",
            "date_published": "2025-12-02T19:23:53+03:00",
            "date_modified": "2025-12-02T19:23:49+03:00",
            "tags": [
                "DataWarehouse",
                "АрхитектураПО",
                "Разработка"
            ],
            "_date_published_rfc2822": "Tue, 02 Dec 2025 19:23:53 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "39",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "29",
            "url": "https:\/\/dimasmotrov.ru\/all\/ya-tut-proekt-pod-klyuch-realizoval\/",
            "title": "Я тут проект под ключ реализовал",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/dimasmotrov.ru\/pictures\/image-16.png.jpg\" width=\"2560\" height=\"1651\" alt=\"\" \/>\n<\/div>\n<p>Для кого заключительная неделя перед релизом, а для меня первый день отпуска. Отоспавшись на выходных, решил подвести итоги своей работы за полдгода.<\/p>\n<p>С декабря месяца я взялся поднимать функциональность аналитики и отчетности в АСМ(это продукт, разработкой которого я занимаюсь). План был прост:<br \/>\n1) Собрать команду<br \/>\n2) Разобраться в устройстве корпоративных хранилищ данных, ведь аналитика и отчетность строится на каких-то данных, а данные еще нужно сложить и подготовить для отображения(привет data engineering).<br \/>\n3) Разобраться в моделирование бизнес-процессов для подготовки аналитических данных.<br \/>\n4) Сделать хранилище и смоделировать один бизнес процесс для обкатки выбранных подходов и инструментов.<br \/>\n5) Сделать отображение данных в графиках и таблицах.<\/p>\n<p>И тут в целом можно было вспомнить, что я так-то бекенд разработчик, чем я тут вообще занимаюсь. Но вспоминать было некогда — работы вагон и еще три состава:<br \/>\n— Вместо одного бизнес процесса моделировать пришлось 5. Два месяца я засыпал и просыпался я в обнимку с томиком Кимбалла.<br \/>\n— Параллельно происходил ресерч и обоснование выбранных технологий для построения ETL-процессов и отображения данных, ресурсов на разработку собственных решений за отведенное время нет.<br \/>\n— Команда собрана. Нас пятеро друзей Оушена.<br \/>\n— Мы соответствуем РБПО, поэтому выбранные инструменты затянуты к себе и взяты на поддержку.<br \/>\n— Были подняты стенды для дев и целевой среды, так на свет родились deb-пакеты для Airflow и Superset, несуществовавшие в природе до этого. CI часть этого всего — это почти еще один продукт :)<br \/>\n— Разработаны ETL-процессы. Полностью. С нуля.<br \/>\n— Разработаны предустановленные отображения для данных. 6 страниц с кучей данных и переходами между друг другом, связанные общими фильтрами.<br \/>\n— Мы разворачиваемся у клиента с минимальными махинациями в админках используемых инструментов — так в dag-скриптах появились env’ы с подключением к БД и автоматический импорт дашбордов.<br \/>\n— Документация. Мы еще даже рассказываем, как при желании сделать собственные страницы с отчетами и как у нас там данные лежат.<\/p>\n<p>Список можно продолжать и дальше, привел ключевые пункты. На самом деле делать пришлось больше запланировано, в конце апреля я сидел и думал, успеем ли мы все сделать. Сделали большую часть, прям блин большую.<\/p>\n<p>Выпускаемся и смотрим, что делаем дальше. Жду обратную связь от пользователей.<\/p>\n<p>Сделано столько работы, а это будто лишь начало пути.<\/p>\n",
            "date_published": "2025-06-02T23:58:08+03:00",
            "date_modified": "2025-06-03T00:03:09+03:00",
            "tags": [
                "DataWarehouse",
                "БазыДанных",
                "Разработка"
            ],
            "image": "https:\/\/dimasmotrov.ru\/pictures\/image-16.png.jpg",
            "_date_published_rfc2822": "Mon, 02 Jun 2025 23:58:08 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "29",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/dimasmotrov.ru\/pictures\/image-16.png.jpg"
                ]
            }
        },
        {
            "id": "23",
            "url": "https:\/\/dimasmotrov.ru\/all\/sqlalchemy-v-etl-processah\/",
            "title": "SqlAlchemy в ETL процессах",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/dimasmotrov.ru\/pictures\/image-10.png\" width=\"1280\" height=\"303\" alt=\"\" \/>\n<\/div>\n<p>На прошлой неделе затягивал алхимию в dag-скрипты для airflow. Так как AF не хостится на нашей стороне, а доставляется до заказчика, хотелось обойтись без использования внутренних соединений с БД(я про connections внутри AF) и написания SQL-запросов в plain-тексте дабы сохранить единообразие кодовой базы с обычными нашими сервисами по максимуму.<\/p>\n<p>По мимо того, что вместо второй версии пришлось использовать 1.4, а это потянуло за собой использование более старых версий mypy и затягивания плагинов для алхимии, ну и переписывание моделей на старый лад, столкнулся с интересным приколом: alembic начал ругаться на то, что у меня для одной метадаты в нескольких моделях одинаковые названия таблиц.<\/p>\n<p>У меня действительно пара моделей с одинаковыми названиями, но одна из этих моделей не видна алембику, ведь я ее скрыл, учитывать ее в миграциях не нужно, эта модель только для чтения. Получалось, что при запуске миграций модуль с базовой моделью грузился дважды из-за того, что базовая модель импортировалась через разные пути.<\/p>\n<p>Можно было решить эту проблему в лоб и переместить папку с миграциями поближе к коду, но это так ужасно выглядело, что нужно было бы еще рефачить структуру файлов в проекте, в общем запара.<\/p>\n<p>В итоге, разделив базовый класс для моделей(и соответственно разделив инстанс метадаты для этих классов), я добавил больше логического разделения и починил проблему с дублированием метадаты.<\/p>\n<p>Дешевое и приятное решение, почаще бы таких :)<\/p>\n",
            "date_published": "2025-05-28T21:30:10+03:00",
            "date_modified": "2025-05-28T21:31:52+03:00",
            "tags": [
                "DataWarehouse",
                "Разработка"
            ],
            "image": "https:\/\/dimasmotrov.ru\/pictures\/image-10.png",
            "_date_published_rfc2822": "Wed, 28 May 2025 21:30:10 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "23",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/dimasmotrov.ru\/pictures\/image-10.png"
                ]
            }
        }
    ],
    "_e2_version": 4134,
    "_e2_ua_string": "Aegea 11.3 (v4134)"
}