Сталкивались ли вы в вашей компании с проблемами?
Невозможностью по-быстрому создать таблицу. Вместо этого нужно катить миграцию, получать апрувы от DWH, следить за тем чтобы таблица была производительна и тд
Вам не нравится BI вашей компании или нравится но но хотелось бы делать визуализацию быстрее.
Если да, то эта статья для вас!
*Эта статья написана аналитиком для аналитиков! Если вы разработчик, DevOps или не дай бог DBA - уходите!
**Вообще эта статья может быть интересной людям двух категорий. Первая это те кто работают в крупных компаниях где уже выстроены процессы. Разработка идет медленно, а введение чего-то нового это та еще бюрократия. И нам нужно хакнуть эти замечательные процессы которые так долго строили.
Вторая - это голый стартап где еще нету ничего.
Есть наверное и третья это джуны. Если вы на собесе шарив экран как бы случайно покажите то чему научитесь тут - можете произвести хорошее впечатление:D
Прочитав эту статью вы научитесь разворачивать локально свою субд ( postgresql ) и BI (metabase). Это правда очень быстро. Это будет ваша маленькая анархия, вы сможете творить там все что угодно, у вас будут полные права которых вы бы никогда не увидели на прод решениях в компаниях.
Доцкер
Разворачивать мы все будем в докере, это самый простой у быстрый способ, поэтому дадим краткое объяснение что это такое ( можно пропустить без вреда на итоговый результат ).
Представьте, что вы пишете программу на языке Python. Эта программа работает на вашем компьютере, но для её успешного выполнения нужны определённые зависимости: версия языка, библиотеки и т.д. Если вы отправите свою программу другу, который запускает её на своём компьютере, существует вероятность, что она не сработает. Это связано с тем, что у него могут быть другие версии языка или библиотек.
Чтобы решить эту проблему, разработчики используют виртуальные окружения. Это пакеты, которые содержат вашу программу и все её зависимости, включая версии языка и библиотек. Однако, если вы разрабатываете программу на Mac, а ваш друг использует Windows 98, вам нужно будет упаковать не только язык и библиотеки, но и операционную систему.
И здесь на помощь приходит Docker. Docker позволяет создать "образ" — пакет, который включает вашу программу, язык, библиотеки и операционную систему. Docker — это программа, которая может запустить этот образ на любом компьютере, обеспечивая тем самым стабильную работу вашей программы независимо от окружения.
Установить его на свою тачку можно скачав файл выбрав свою ОС, я буду делать все на Mac OS.
Я же предпочитаю более простой способ установки, выполнить: brew install docker
в терминале.
Отлично! У нас появился докер!
Создаем свой локальный postgresql
Всюду ниже я буду работать в PyCharm.
Для упорядоченности создаем отдельный проект в PyCharm ( на самом деле просто папка ), назовем его пусть my-postgres
В проекте создаем файл docker-compose.yml
И в сам файл закидываем образ нашей субд :
version: '3.8' # Версия Docker Compose
services:
postgres:
image: postgres:latest # Используем последний образ PostgreSQL
container_name: my-postgres # Имя контейнера
environment:
POSTGRES_USER: myuser # Имя пользователя для базы данных
POSTGRES_PASSWORD: mypassword # Пароль для пользователя
POSTGRES_DB: my-postgres # Имя создаваемой базы данных
ports:
- "5432:5432" # Проброс порта 5432 для доступа к базе данных
volumes:
- pgdata:/var/lib/postgresql/data # Создание тома для хранения данных
volumes:
pgdata: # Определяем volume для хранения данных
Далее открываем терминал в докере который мы ранее установили и поднимаем бд:docker-compose -f /< Абсолютный путь к файлу>/docker-compose.yml up -d
Должно появится такое:
Пробуем подключится из под DataGrip ( или любой другой клиент )
Создадим таблицу для примера:
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
age INT
);
*Код выполняю в DataGrip, на забывайте смотреть и читать логи что возвращает субд на ваш запрос
И давайте сделаем то ради чего это затевалось, создадим DataFrame и запишем его в таблицу:
import pandas as pd
from sqlalchemy import create_engine
# Подключение к базе данных PostgreSQL
db_host = 'localhost'
db_port = '5432'
db_name = 'postgres' # Имя создаваемой базы данных
db_user = 'myuser' # Имя пользователя для базы данных
db_password = 'mypassword' # Пароль для пользователя
# Создание подключения с использованием SQLAlchemy
engine = create_engine(f'postgresql+psycopg2://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}')
# Создание DataFrame с данными
data = {
'name': ['Alice', 'Bob', 'Charlie'],
'age': [30, 25, 35]
}
df = pd.DataFrame(data)
# Запись данных в таблицу employees
df.to_sql('employees', engine, if_exists='append', index=False)
print('Data inserted into PostgreSQL successfully')
После лога об успешном инсерте делаем select * from employees и получаем желаемое!
Кстати в реальных задачах я обычно беру df который мне нужно записать.
Делаю df.dtypes и отдаю это чат гпт, прошу создать create table.
Это сильно ускоряет и избавляет от однотипной рутины.Пункт со звездочкой. Если вы хотите работать с большими данными и чтобы у вас не тупило на таблицы нужно навешивать индексы. Но часто на это можно забить.
Разворачиваем свой BI
Для тех кто уже работал с metabase ранее этот кусок будет лютая имба.
Создаем также новый проект ( опционально )
В нем также создаем файл docker-compose.yml
( если создаете в старом проекте то этот ямлик называйте иначе )
Пишем образ metabase:
version: '3'
services:
metabase:
image: metabase/metabase:latest
ports:
- "3000:3000"
environment:
MB_DB_TYPE: "postgres" # Используем PostgreSQL
MB_DB_HOST: "postgres_metabase" # имя сервиса базы данных
MB_DB_USER: "metabase"
MB_DB_PASS: "password"
MB_DB_NAME: "metabase"
ports: "5433:5432"
volumes:
- metabase-data:/metabase.db
postgres_metabase:
image: postgres:latest
environment:
POSTGRES_DB: "metabase"
POSTGRES_USER: "metabase"
POSTGRES_PASSWORD: "password"
ports: "5433:5432"
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
metabase-data:
postgres-data:
И в терминале докера стартуем приложение:
docker-compose -f /< Абсолютный путь к файлу>/docker-compose.yml up -d
*Не забывайте пожалуйста что это новый образ, у него другой путь.
И дальше ждем.
Приложение тяжелое и разворачивается долго ( это окей если до 15 минут ).
Периодически можно поглядывать логи контейнеров.
Как поднимется заходим сюда: http://localhost:3000/
Пройдя базовые настройки попадаем на главную.
Далее можем подключить базы через интуитивный веб интерфейс ( управление -> базы данных ).
CH не будет из под коробки, но не пугайтесь там просто нужно будет добавить JDBC драйвер.
А что по итогу?
Теперь у меня есть своя бд и bi где я могу делать что угодно, супер быстро и с правами которых никогда не было.
Но что если мне нужно что-то показать менеджеру? Я скачиваю картинку из metabase и только так могу пошерить результат.
Могу ли сделать так чтобы мои отчеты были доступны другим? Если вы достаточно безумны то это реально.
По сути там нужно повторить весь флоу, предварительно создав виртуалку.
К примеру создаем ЯО, накатываем туда все необходимое ( в том числе и корпоративный vpn если доступ к вашим бд под только из под впн ).
С последним кстати могут быть проблемы так как Firewall не обойти и возможно нужно будет просить чтобы добавили в white list.
Виртуалка будет точно платная, в ЯО пожалуй самая дорогая но не так чтобы очень много, около 2к в месяц. Статичный IP будет дороже, а с динамичным замучаетесь если не дай бог вы действительно будете использовать это в прод:D
Комментарии (3)
cheremyha Автор
14.01.2025 09:25но зачем так заморачиваться в реальных условиях не понимаю.
Ты можешь крутить свои локальные проекты в своих локальных базах, в случае когда в боевых возможности нету ( кейсы выше )
Либо если это вообще стартап то ты можешь развернуть это в облаке ( вместо деф опс и дба )
Понятно что это не очень хорошо, но когда надо быстро то почему бы и нет
Еще один кейс когда ты не можешь юзать сандбокс это всякие ограничения с памятью или типами данных.
То есть когда что-то не влезает или не проходит по типам в кх
hellomrprettyflacko
Хорошая статься, что бы потренить SQL на advanced уровне и пощупать Metabase, но зачем так заморачиваться в реальных условиях не понимаю. Как тут решается проблема с доступами? Тебе же эневией придётся всё запросить, а поиграться с созданием табличек обычно можно в схеме sandbox
cheremyha Автор
В одной компании у нас не было сандбокс, двх и дба был против
А в другой компании был сандбокс, но там все удалялось ночью