Привет, коллеги! 👋
Снова с вами рубрика "вечерний вайбкодер", и сегодня я принёс вам MyRepETL (Ссылка на github)— инструмент для ETL через MySQL репликацию.
Зачем это нужно?
Задача: у вас куча MySQL баз в микросервисах, нужно всё это затащить в Metabase для красивых отчетов.
Проблема в том, что:
В каждой базе своя схема и структура
Данные нужно объединить и нормализовать
Metabase любит когда всё в одном месте
Ручной экспорт/импорт — это боль
MyRepETL решает это: берёт данные из всех ваших баз, трансформирует их на лету и складывает в единую аналитическую базу для Metabase.
Что умеет MyRepETL
🚀 Основные фишки
Многопоточность из коробки
Каждый источник работает в своём потоке
Не блокирует друг друга
Автоматически восстанавливается при сбоях
Гибкие трансформации
Переименование таблиц и колонок
Вычисляемые поля
Фильтрация данных
Кастомные Python-функции
JSON-конфигурация
Всё настраивается через конфиг
Как использовать
Простая синхронизация
Самый базовый случай — просто скопировать данные из одной базы в другую:
{ "sources": { "prod_db": { "host": "prod-mysql", "user": "repl_user", "password": "repl_pass", "database": "production" } }, "targets": { "backup_db": { "host": "backup-mysql", "user": "backup_user", "password": "backup_pass", "database": "backup" } }, "mapping": { "prod_db.users": { "source": "prod_db", "target": "backup_db", "source_table": "users", "target_table": "users" } } }
С трансформациями
А теперь добавим магию — переименуем таблицу, добавим вычисляемые поля:
{ "mapping": { "prod_db.customers": { "source": "prod_db", "target": "analytics_db", "source_table": "customers", "target_table": "users", "column_mapping": { "id": {"column": "user_id"}, "name": {"column": "full_name"}, "email": {"column": "email"}, "birth_date": {"column": "age", "transform": "transform.calculate_age"}, "phone": {"column": "formatted_phone", "transform": "transform.format_phone"}, "created_at": {"column": "registration_date"}, "source": {"column": "source_system", "value": "production"} } } } }
Создайте файл transform.py с вашими функциями:
# transform.py def calculate_age(birth_date, row_data, table): from datetime import datetime if not birth_date: return None birth = datetime.strptime(birth_date, '%Y-%m-%d') return (datetime.now() - birth).days // 365 def format_phone(phone, row_data, table): if not phone: return None # 79991234567 -> +7 (999) 123-45-67 return f"+7 ({phone[1:4]}) {phone[4:7]}-{phone[7:9]}-{phone[9:11]}"
Запуск
# Установка с GitHub pip install git+https://github.com/tumurzakov/myrepetl.git # Или клонировать и установить локально git clone https://github.com/tumurzakov/myrepetl.git cd myrepetl pip install -e . # Запуск с конфигом myrepetl run config.json # Или через Docker docker run -v ./config.json:/app/config.json myrepetl:latest
На этом всё, удачного кодинга! 👨💻
