Базы данных_BE1
Открыть в Telegram
Канал по по различным базам данных, полезный и интересный контент для всех уровней. По вопросам сотрудничества @cyberJohnny
Больше189
Подписчики
Нет данных24 часа
Нет данных7 дней
-730 дней
Архив постов
SQLZoo
— это полная база по SQL, MySQL, PostgreSQL и самым популярным базам данных: крутые запросы под любые задачи, топовые функции, транзакции и даже лайфхаки интеграции с популярными языками программирования.
— Тысячи практических кейсов всех уровней сложности — от полного нуба до уровня смешарика.
— Пошаговая прокачка к сертификации, чтобы официально доказать, что ты реально шаришь в базах данных.
Забираем (https://sqlzoo.net/wiki/SQL_Tutorial)
@bzd_be1
🦀 Новый SQL-клиент на Rust — rsql
Лёгкий, быстрый и мощный инструмент для работы с файлами и базами данных из терминала.
📌 Что умеет
● Поддержка множества форматов: CSV, JSON, Parquet, Excel, XML, YAML, Avro и др.
● Подключение к SQLite, PostgreSQL, MySQL, SQL Server, DuckDB, Snowflake, CrateDB и даже DynamoDB
● Работа с архивами: Gzip, Zstd, Brotli, LZ4, Bzip2 и др.
● Удобная CLI: автодополнение, подсветка, история, интерактивный REPL
● Вывод в разных форматах: Markdown, HTML, JSON, CSV, plaintext
● 100 % безопасный Rust-код — `#![forbid(unsafe_code)]`
● Кастомизация: Vi/Emacs режимы, локализации, собственные темы вывода
📥 Установка
```
curl -LsSf https://raw.githubusercontent.com/theseus-rs/rsql/main/install.sh | sh
```
🧪 Пример использования
```
# Одноразовый запрос к SQLite
rsql —url "sqlite://file.db" — "SELECT * FROM users LIMIT 5;"
# Интерактивная сессия с PostgreSQL
rsql —url "postgres://user:pass@localhost/db"
```
🆕 Что нового в v0.19.0
Добавлены драйверы CrateDB и FlightSQL
Появился metadata-catalog для удобной навигации по источникам данных
Улучшены примеры, обновлены зависимости, повышена стабильность
🔗 GitHub: https://github.com/theseus-rs/rsql
rsql — универсальный инструмент, который понравится аналитикам, разработчикам и data-инженерам, нуждающимся в максимально быстром и простом SQL-клиенте.
@bzd_be1
🖥 PgAssistant — это бесплатное open-source решение для помощи разработчикам и DBA в понимании, анализе и оптимизации производительности PostgreSQL-баз данных
🔧 Основные функции
- Анализ поведения БД: разбирает использование pg_stat_statements и выявляет «горячие» запросы
- Оптимизация схемы: помогает исправлять проблемы структуры таблиц и индексов
- Библиотека запросов: хранит часто используемые SQL-запросы в JSON‑файле (например myqueries.json)
Linting SQL: встроенный Python‑Sqlfluff для проверки стиля и синтаксиса
- OpenAI/LLM‑помощь: при наличии API-ключа к OpenAI, Ollama или другому LLM вы можете автоматически улучшать запросы и планы выполнения
- Экспорт DDL: получает DDL через pg_dump для анализа через LLM
- Автоматизация параметров: использует pgtune и Docker‑compose для настройки ALTER SYSTEM и генерации конфигураций
github.com
.- Запуск через Docker или Flask: легко стартовать локально или в контейнере .
💡 Как начать?
- Убедитесь, что установлен модуль pg_stat_statements.
- Вы можете сразу запустить готовым Docker-образом.
- Вариант без Docker — через Python/Flask.
- При наличии LLM‑ключа — подключите OpenAI, Ollama и т.д.
- Настройте свою коллекцию запросов в myqueries.json.
- Используйте анализ, lint, советы по индексам и конфигам!
pgAssistant — мощный инструмент для анализа и оптимизации PostgreSQL. Он сочетает детерминированные проверки и интеллектуальные подсказки LLM, и отлично подойдёт как разработчикам, так и начинающим администраторам баз данных. Если нужно — могу помочь с примерами использования, настройкой LLM или запуском через Docker/Flask.
Репозиторий (https://github.com/nexsol-technologies/pgassistant) на GitHub насчитывает более 1 300+ ⭐ и активно развивается .
📌 Github (https://github.com/nexsol-technologies/pgassistant)
@bzd_be1
🖥 py-pglite — PostgreSQL без установки, тестируй как с SQLite!
py-pglite — обёртка PGlite для Python, позволяющая запускать настоящую базу PostgreSQL прямо при тестах. Без Docker, без настройки — просто импортируй и работай.
📌 Почему это круто:
- 🧪 Ноль конфигурации: никакого Postgres и Docker, только Python
- ⚡ Молниеносный старт: 2–3 с против 30–60 с на традиционные подходы :contentReference[oaicite:2]{index=2}
- 🔐 Изолированные базы: новая база для каждого теста — чисто и безопасно
- 🏗️ Реальный Postgres: работает с JSONB, массивами, оконными функциями
- 🔌 Совместимость: SQLAlchemy, Django, psycopg, asyncpg — любая связка :contentReference[oaicite:3]{index=3}
💡 Примеры установки:
```
pip install py-pglite
pip install py-pglite[sqlalchemy] # SQLAlchemy/SQLModel
pip install py-pglite[django] # Django + pytest-django
pip install py-pglite[asyncpg] # Асинхронный клиент
pip install py-pglite[all] # Всё сразу
```
🔧 Пример (SQLAlchemy)
```
python
def test_sqlalchemy_just_works(pglite_session):
user = User(name="Alice")
pglite_session.add(user)
pglite_session.commit()
assert user.id is not None
```
py‑pglite — идеальный инструмент для unit- и интеграционных тестов, где нужен настоящий Postgres, но без всей админской рутины.
Полноценный PostgreSQL — без его тяжеловесности.
▪Github (https://github.com/wey-gu/py-pglite)
#python #sql #PostgreSQL #opensource
@bzd_be1
🖥 Database Build (https://database.build/) — база данных в 1 клик
Просто напиши: *«Создай базу для пиццерии»* — и получишь готовую структуру:
таблицы, связи, ER-диаграмму.
🛠 Что можно дальше:
• Редактировать таблицы
• Сгенерировать тестовые данные
• Экспортировать в SQL
• Задеплоить в Supabase (AWS — скоро)
https://database.build/ (https://database.build/)
@bzd_be1
🦆 Как использовать DuckDB с Python: практическое руководство по аналитике
DuckDB — это современная in-process аналитическая СУБД, разработанная как “SQLite для аналитики”. Она идеально подходит для обработки больших объёмов данных на локальной машине без необходимости поднимать сервер или использовать тяжёлые хранилища.
📦 Что делает DuckDB особенной?
- Работает как библиотека внутри Python (через `duckdb`)
- Поддерживает SQL-запросы напрямую к pandas DataFrame, CSV, Parquet, Arrow и другим источникам
- Оптимизирована под аналитические запросы: агрегации, группировки, фильтрации
- Мгновенно работает с большими файлами без предварительной загрузки
🧪 Пример рабочего сценария:
1️⃣ Чтение и анализ Parquet-файла:
```
import duckdb
duckdb.sql("SELECT COUNT(*), AVG(price) FROM 'data.parquet'")
```
2️⃣ Интеграция с pandas:
```
import pandas as pd
df = pd.read_csv("data.csv")
result = duckdb.sql("SELECT category, AVG(value) FROM df GROUP BY category").df()
```
3️⃣ Объединение нескольких источников:
```
duckdb.sql("""
SELECT a.user_id, b.event_time
FROM 'users.parquet' a
JOIN read_csv('events.csv') b
ON a.user_id = b.user_id
""")
```
🧠 Почему это важно:
- 📊 Вы можете использовать SQL и pandas одновременно
- 🚀 DuckDB быстрее pandas в большинстве аналитических задач, особенно на больших данных
- 🧩 Поддержка стандартов данных (Parquet, Arrow) даёт нативную интеграцию с экосистемой Data Science
- 🔧 Не требует настройки: просто установите через `pip install duckdb`
🎯 Применения:
- Локальный анализ данных (до десятков ГБ) — без Spark
- Объединение таблиц из разных форматов (Parquet + CSV + DataFrame)
- Прототипирование ETL-пайплайнов и построение дашбордов
- Быстрая агрегация и отчёты по логам, BI-данным, IoT-стримам и пр.
📌 Советы:
- Используйте `read_parquet`, `read_csv_auto` и `from_df()` для гибкой загрузки данных
- Результаты запросов можно конвертировать обратно в pandas через `.df()`
- DuckDB поддерживает оконные функции, `GROUP BY`, `JOIN`, `UNION`, `LIMIT`, подзапросы и многое другое — это полноценный SQL-движок
🔗 Подробный гайд:
https://www.kdnuggets.com/integrating-duckdb-python-an-analytics-guide
#DuckDB #Python #DataScience #Analytics #SQL #Pandas #Parquet #BigData
@bzd_be1
Задачка по нашей базе данных, которая находится в шапке канала.
Код генерации базы данных и INSERT данных по ссылке ТУТ.
ВОПРОС: Что обеспечивает внешний ключ FOREIGN KEY (category_id) REFERENCES category(category_id) в таблице product?
Ответ под спойлером, но если хотите сперва проверить свою догадку, следующим постом опубликуем тест с вариантами ответов.
Правильный ответ: Целостность данных между таблицами product и category.
@bzd_be1
🚀 Вышел стабильный релиз (https://mariadb.com/kb/en/mariadb-11-4-2-release-notes/) MariaDB 11.8.2 — первая стабильная версия новой ветки с долгосрочной поддержкой (LTS, 5 лет). Также доступен предварительный релиз MariaDB 12.0.1.
🔹 Что нового в 11.8 по сравнению с предыдущим LTS 11.4:
🧠 Векторный поиск
Добавлены возможности из проекта *MariaDB (https://vk.com/club57234139) Vector*:
• Новый тип данных `VECTOR`
• Функции для сравнения векторов: `VEC_DISTANCE_EUCLIDEAN()`, `VEC_DISTANCE_COSINE()`, `VEC_DISTANCE()`
• Поддержка SIMD-ускорений: AVX2/AVX512, ARM, Power10
• Производительность векторных запросов выше Redis, pgvector, qdrant и weaviate
🧭 Поддержка времени до 2106 года
Решена проблема 2038 — TIMESTAMP теперь работает до 2106 года
🌍 Новая кодировка и локаль
По умолчанию теперь `utf8mb4`, полная поддержка emoji
Обновлены правила сортировки (Collation) до UCA 14.0.0
🔐 Новый механизм аутентификации: PARSEC
• PBKDF2 + ed25519
• Безопасная верификация пароля
💾 Многопоточность в дампе и импорте
• `mariadb-dump` и `mariadb-import` теперь используют многопоточность
• Поддержка резервного копирования как одной, так и нескольких БД
📈 Ускоренная репликация
• Новый механизм binlog-сегментации
• Асинхронный rollback после сбоев
• Параметр `slave_replication_delay_abort_timeout` для отмены "зависших" транзакций
🛠️ Новые фичи и команды
• Таблица `USERS` для контроля доступа
• Команды `FLUSH GLOBAL STATUS`, `REPAIR TABLE ... FORCE`, `SHOW CREATE SERVER`
• Возврат значений типа `ROW` из хранимых процедур
• Поддержка Oracle-подобных SEQUENCE
• Функции `UUID_v4`, `UUID_v7`
• `FORMAT_BYTES(1000000000)` = `953.67 MiB`
• Ограничения на размер временных файлов (`max_tmp_session_space_usage`, `max_tmp_total_space_usage`)
⚙️ Оптимизации
• Ускоренные `UPDATE/DELETE`, `SUBSTR(...) = const`
• Улучшена работа с виртуальными столбцами
• Авто-оптимизация кодировок
💡 Контекст
MariaDB — форк MySQL, с дополнительными хранилищами и расширенными возможностями, не зависящий от Oracle. Используется в RHEL, SUSE, Fedora, Debian, Arch и проектах вроде Wikipedia и Google Cloud SQL.
📌 Если вы работаете с векторным поиском, большими БД или вам важно долгосрочное сопровождение — MariaDB 11.8 теперь must-have.
https://mariadb.com/kb/en/mariadb-11-4-2-release-notes/
@bzd_be1
🔢 PGVector: векторный поиск прямо в PostgreSQL — гайд
Если ты работаешь с embedding'ами (OpenAI, HuggingFace, LLMs) и хочешь делать семантический поиск в SQL — тебе нужен `pgvector`. Это расширение позволяет сохранять и сравнивать векторы прямо внутри PostgreSQL.
📦 Установка PGVector (Linux)
```
git clone —branch v0.8.0 https://github.com/pgvector/pgvector.git
cd pgvector
make
sudo make install
```
Или просто:
• macOS: `brew install pgvector`
• Docker: `pgvector/pgvector:pg17`
• PostgreSQL 13+ (через APT/YUM)
🔌 Подключение расширения в базе
```
CREATE EXTENSION vector;
```
После этого ты можешь использовать новый тип данных `vector`.
🧱 Пример использования
Создаём таблицу:
```
CREATE TABLE items (
id bigserial PRIMARY KEY,
embedding vector(3)
);
```
Добавляем данные:
```
INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]');
```
Поиск ближайшего вектора:
```
SELECT * FROM items
ORDER BY embedding <-> '[3,1,2]'
LIMIT 5;
```
🧠 Операторы сравнения
PGVector поддерживает несколько видов расстояний между векторами:
- `<->` — L2 (евклидово расстояние)
- `<#>` — скалярное произведение
- `<=>` — косинусное расстояние
- `<+>` — Manhattan (L1)
- `<~>` — Хэммингово расстояние (для битовых векторов)
- `<%>` — Жаккар (для битовых векторов)
Также можно усреднять вектора:
```
SELECT AVG(embedding) FROM items;
```
🚀 Индексация для быстрого поиска
HNSW (лучшее качество):
```
CREATE INDEX ON items USING hnsw (embedding vector_l2_ops);
```
Параметры можно настраивать:
```
SET hnsw.ef_search = 40;
```
#### IVFFlat (быстрее создаётся, но чуть менее точный):
```
CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);
SET ivfflat.probes = 10;
```
🔍 Проверка версии и обновление
```
SELECT extversion FROM pg_extension WHERE extname='vector';
ALTER EXTENSION vector UPDATE;
```
📌 Особенности
- Работает с PostgreSQL 13+
- Поддержка до 2000 измерений
- Расширяемый синтаксис
- Можно использовать `DISTINCT`, `JOIN`, `GROUP BY`, `ORDER BY` и агрегации
- Подходит для RAG-пайплайнов, NLP и встраивания LLM-поиска в обычные SQL-приложения
🔗 Подробнее (https://www.blackslate.io/articles/how-to-install-and-configure-pgvector-a-detailed-guide)
💡 Храни embedding'и прямо в PostgreSQL — и делай семантический поиск без внешних векторных БД.
@bzd_be1
📦 Outbox — надёжная реализация outbox-паттерна на Go для микросервисов
Если твои сервисы пишут в базу и одновременно публикуют события в Kafka, RabbitMQ или другие брокеры — знай: без outbox-паттерна ты рискуешь потерять данные.
🔧 `Outbox` — это лёгкая и удобная библиотека на Go, которая помогает сделать доставку сообщений атомарной и надёжной, без лишней сложности.
🧠 Что она делает:
1. Сохраняет событие в таблицу `outbox` в рамках транзакции
2. Отдельный воркер читает сообщения и отправляет их в брокер
3. После успешной доставки — сообщение помечается как доставленное
💡 Особенности:
- Поддержка PostgreSQL
- Готовые адаптеры для Kafka и RabbitMQ
- Возможность использовать свой брокер (реализуй интерфейс)
- Поддержка сериализации / форматирования событий
- Использует `sqlx` и стандартную `database/sql`
🧩 Подходит для:
- надёжной синхронизации БД ↔ событий
- микросервисов, где важна консистентность
- систем, где нужна повторная доставка без дублей
🔥 Отличный выбор, если ты хочешь atomic-публикацию событий без тяжёлых фреймворков и сервисов.
#Go #OutboxPattern #Kafka #RabbitMQ #Microservices #EventDriven #PostgreSQL
🔗 https://github.com/oagudo/outbox
@bzd_be1
🔁 Как перезапускать сервис только если он завис?
Иногда не хочется перезапускать сервис "на всякий случай", но вот если он реально завис — другое дело. Вот простой способ проверять, активен ли сервис, и перезапускать его при зависании:
```
#!/bin/bash
SERVICE="nginx"
if ! systemctl is-active —quiet "$SERVICE"; then
echo "$(date): $SERVICE не активен, пробую перезапустить..." >> /var/log/service_monitor.log
systemctl restart "$SERVICE"
else
echo "$(date): $SERVICE работает нормально" >> /var/log/service_monitor.log
fi
```
🛠 Можно добавить в крон, например, проверку каждые 5 минут:
```
*/5 * * * * /usr/local/bin/check_nginx.sh
```
📁 Не забудь сделать скрипт исполняемым:
```
chmod +x /usr/local/bin/check_nginx.sh
```
💡 Можно заменить `nginx` на любой другой системный сервис.
👉@bash_srv (https://vk.com/club229684677)
@bzd_be1
Нашли промт, с которым можно выучить ЧТО УГОДНО: Реддитор расписал огромную текстовую подсказку, которая заставляет ИИ пилить курсы с использованием передовых учебных методик.
Работает очень просто: замените [текст в скобочках] на вашу тему и отправляйте ChatGPT или другому чат-боту.
ROLE
You are EDU-Epistemic, an AI consultant who blends epistemology (how we know) with the philosophy of education (what and how we should learn). Your mission is to co-design a standards-aligned curriculum.
VARIABLE SETTINGS
CourseTitle = [Python для новичков]
maxWords = 500 (max per module content)
confirm = true (true = ask before each step, false = auto-proceed)
format = markdown (markdown | csv | json)
GLOBAL RULES
1. Follow the phases exactly in order. If user skips ahead, say: “We’re at Phase X-Y. Please finish/confirm this phase first.”
2. Produce GitHub-Flavoured Markdown tables (no code fences).
3. Keep each table cell under 40 characters. Wrap text if needed.
4. For every row, choose one epistemological base: Pragmatic | Critical | Reflective | Procedural | Instrumental | Normative. Justify in 15 words max.
5. Include Bloom’s Taxonomy domain and Adult-Learning (Andragogy) validation in columns.
6. For Validation columns, mark ✅ or ❌ plus a note (≤ 20 characters).
7. If format ≠ markdown, show both Markdown and the requested format.
8. Put each interactive CLI in a fenced text block, wait for learner input before replying.
9. If output nears token limits, pause and ask: “Continue?”
TABLE TEMPLATES
OutcomeTable
| Outcome # | Proposed Outcome | Bloom Domain | Epistemic Base | Educational Validation ✅/❌ |
SkillTable
| Skill # | Skill Description | Outcome # | Bloom Domain | Epistemic Base | Validation ✅/❌ |
AlignmentMatrix
| Outcome # | Outcome Description | Supporting Skills | Justification (≤ 50 words) |
⸻
PHASE 1 – OUTCOMES & SKILLS
1. Course Outcomes
• Fill OutcomeTable
• Caption: Table 1.1 – Course Outcomes
• Ask “Type CONTINUE to proceed” if confirm = true
2. Key Skills
• Generate 2–4 skills per outcome (Skill 1.1, 1.2…)
• Fill SkillTable
• Caption: Table 1.2 – Key Skills
• Confirm per confirm
3. Alignment Matrix
• Fill AlignmentMatrix
• Caption: Table 1.3 – Outcome–Skill Alignment
• Confirm per confirm
⸻
PHASE 2 – SKILL MODULES
Execute for each Skill in numeric order
1. Header: “Skill X.Y: ”
2. Objective: one clear, verb-led sentence
3. Content: up to maxWords; reference the Outcome
4. Knowledge Claims: bullet list with [Validated ✅/❌ + 10-word rationale]
5. Reasoning & Assumptions: max 150 words
6. Prompt to proceed (if confirm = true)
7. Interactive Activities (CLI): simulate command-line task; repeat until learner hits 80%+
8. Assessment (CLI): same format; provide feedback or remediation
9. End-of-module prompt to continue to next Skill or finish
Answer in Russian
@bzd_be1
🔥 CTE + DELETE — это комбинация общего табличного выражения (Common Table Expression, CTE) и оператора DELETE, которая позволяет удобно удалять строки из таблицы, особенно в случаях, когда удаление зависит от сложного подзапроса или JOIN-ов.
🔍 Что такое CTE?
CTE (WITH выражение) — это временный набор данных, определённый перед основным SQL-запросом.
🧹 Зачем использовать CTE с DELETE?
Упрощает чтение и понимание кода при сложных условиях.
Позволяет использовать JOIN, ROW_NUMBER() и другие функции перед удалением.
Избавляет от подзапросов в WHERE, которые иногда трудно читать.
📌 Пример: Удалить дубликаты по email, оставив только один
```
WITH duplicates AS (
SELECT id,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS rn
FROM users
)
DELETE FROM users
WHERE id IN (
SELECT id FROM duplicates WHERE rn > 1
);
```
🧠 Здесь:
CTE duplicates присваивает каждой строке номер внутри группы одинаковых email.
Удаляем все строки, где rn > 1 — то есть дубликаты.
📌 Пример: Удаление с JOIN
```
WITH to_delete AS (
SELECT u.id
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.status = 'cancelled'
)
DELETE FROM users
WHERE id IN (SELECT id FROM to_delete);
```
📌 Поддержка:
Работает в PostgreSQL, SQL Server, Oracle (с USING или WITH).
В MySQL с 8.0+ CTE поддерживаются, но DELETE с CTE может потребовать подзапрос.
@bzd_be1
🧠 SkyRL-SQL — лёгкий RL-подход для Text-to-SQL от NovaSky, который превзошёл GPT-4o и o4-mini, обучаясь всего на 653 примерах!
📌 Что это:
SkyRL-SQL — это эффективный RL-фреймворк для генерации SQL-запросов из текста.
Модель `SkyRL-SQL-7B` обучена с нуля с использованием обучения с подкреплением (reinforcement learning), без гигантских датасетов.
📊 Результаты на Spider-бенчмарках:
`| Модель | Spider-Dev | Spider-Test | Realistic | DK | Syn | Среднее |
|--------------------|------------|-------------|-----------|------|------|---------|
| GPT-4o | 81.3 | 82.4 | 80.1 | 72.1 | 71.9 | 77.6 |
| o4-mini | 80.6 | 81.8 | 81.2 | 70.8 | 72.1 | 77.3 |
| **SkyRL-SQL-7B** | **83.9** | **85.2** | **81.1** | 72.0 | 73.7 | **79.2** |`
🔍 Особенности:
• RL-обучение по шагам с интерактивной проверкой
• Поддержка уточнения SQL на основе ошибок
• Обучение всего на 653 примерах
• Превосходит более крупные модели на практике
GitHub: https://github.com/NovaSky-AI/SkyRL
Блог: https://novasky-ai.github.io/posts/skyrl-sql
🧪 Отличный пример того, как можно бить гигантов с умной архитектурой, а не только размерами.
📌 Github (https://github.com/NovaSky-AI/SkyRL)
@bzd_be1
🚀 Сертификация DataLens Analyst — способ подтвердить свою экспертизу в BI и систематизировать работу с одним из самых популярных российских BI-инструментов — платформой от Yandex Cloud. Подходит всем, кто строит чарты, дашборды и анализирует данные.
Сертификация охватывает ключевые темы: вычисляемые поля, параметры, датасеты, подключения к источникам, навигацию и управление доступом. Подготовка простая: бесплатный курс и примеры заданий собраны на одной странице.
🎯 До конца августа сертификация стоит 2 500 ₽ вместо 5 000 ₽ — отличный повод добавить сильную строчку в резюме https://vk.cc/cMn3KE
SQL 👆
@bzd_be1
🖥 Гайд по ускорению Python, который реально стоит прочитать 🔥
Без лишней теории — только рабочие практики, которые используют разработчики в боевых проектах.
Внутри:
• Как искать bottleneck'и и профилировать код
• Где и когда использовать Numba, Cython, PyPy
• Ускорение Pandas, NumPy, переход на Polars
• Асинхронность, кеши, JIT, сборка, автопрофилировка — всё по полочкам
• Только нужные инструменты: scalene, py-spy, uvloop, Poetry, Nuitka
⚙️ Написано просто, чётко и с прицелом на production.
📌 Полная версия онлайн (https://uproger.com/optimizciyaiuskoreniecodanapython/)
@bzd_be1
🛠️ Bob
`Bob` — это универсальный инструмент для работы с SQL в Go, который сочетает в себе:
• генератор кода
• ORM-подход
• гибкий конструктор SQL-запросов
📌 Что умеет Bob:
🔹 Генерация моделей и фабрик
Автоматически создаёт Go-код по схеме вашей базы данных. Ускоряет работу с моделями и минимизирует ручную писанину.
🔹 Поддержка PostgreSQL, MySQL, SQLite
Работает с самыми популярными базами данных — удобно для любых проектов.
🔹 Генерация типобезопасного кода из SQL
Как в `sqlc`, но с поддержкой дополнительных ORM-фич.
🔹 Гибкий конструктор запросов
Строит SQL-запросы на Go с читабельным синтаксисом — без ручной сборки строк.
🔹 Поддержка связей (associations)
Автоматически определяет связи между таблицами по внешним ключам. Включает `has-one`, `has-many`, `has-many-through` и др.
📚 Подробнее:
▪ GitHub: https://github.com/stephenafamo/bob
▪ Документация: https://bob.stephenafamo.com/docs/code-generation/intro
Если ты работаешь с Go и SQL — попробуй Bob. Это как `sqlc`, но с усиленной ORM-магией.
@bzd_be1
🔥 Polars: шпаргалка
Polars ≠ Pandas. Это колоночный движок, вдохновлённый Rust и SQL. Никаких SettingWithCopyWarning — всё иммутабельно и параллелится.
🚀 Быстрый старт
import polars as pl
df = pl.DataFrame({
"id": [1, 2, 3],
"name": ["Alice", "Bob", "Charlie"],
"score": [95, 85, 100]
})
📊 Выборка и фильтрация
df.filter(pl.col("score") > 90)
df.select(pl.col("name").str.lengths())
df[df["id"] == 2]
• Комбинированные условия:
df.filter((pl.col("score") > 80) & (pl.col("name").str.contains("A")))
---
## ⚙ Трансформации
• Вычисление новых колонок:
df.with_columns([
(pl.col("score") / 100).alias("percent"),
pl.col("name").str.to_uppercase().alias("name_upper")
])
• Удаление/переименование:
df.drop("id").rename({"name": "username"})
• apply() — только если нельзя обойтись иначе:
df.with_columns(
pl.col("score").map_elements(lambda x: x * 2).alias("doubled")
)
🧠 Группировка и агрегаты
df.groupby("name").agg([
pl.col("score").mean().alias("avg_score"),
pl.count()
])
• Агрегация с кастомной функцией:
df.groupby("name").agg(
(pl.col("score") ** 2).mean().sqrt().alias("rms")
)
---
## 🪄 Ленивая обработка (LazyFrame)
lf = df.lazy()
result = (
lf
.filter(pl.col("score") > 90)
.with_columns(pl.col("score").log().alias("log_score"))
.sort("log_score", descending=True)
.collect()
)
✅ Всё оптимизируется *до выполнения* — pushdown, predicate folding, projection pruning.
🔥 Joins
df1.join(df2, on="id", how="inner")
Варианты: "inner", "left", "outer", "cross", "semi", "anti"
📂 Работа с файлами
pl.read_csv("data.csv")
df.write_parquet("out.parquet")
pl.read_json("file.json", json_lines=True)
Ленивая загрузка:
pl.read_parquet("big.parquet", use_pyarrow=True).lazy()
---
## 🧮 Аналитика и окна
df.with_columns([
pl.col("score").rank("dense").over("group").alias("rank"),
pl.col("score").mean().over("group").alias("group_avg")
])
🧱 Структуры, списки, explode
df = pl.DataFrame({
"id": [1, 2],
"tags": [["a", "b"], ["c"]]
})
df.explode("tags")
• Работа с вложенными списками:
df.select(pl.col("tags").list.lengths())
🧪 Полезные фичи
• Проверка типов:
df.schema
df.dtypes
• Проверка на null:
df.filter(pl.col("score").is_null())
• Заполнение:
df.fill_null("forward")
• Выбор n лучших:
df.sort("score", descending=True).head(5)
📦 Советы и best practices
• Используй lazy() для производительности.
• Избегай .apply() — если можешь, используй pl.col().map_elements() или векторные выражения.
• Сохраняй schema — удобно при пайплайнах данных.
• @pl.api.register_expr_namespace("yourns") — добавляй кастомные методы как namespace.
✅ Polars: минимализм, скорость, безопасность.
Если надо — сделаю обложку, PDF, интерактивную памятку или сравнение с pandas.
@bzd_be1
Хитрая SQL-задача на Oracle: кто не продал — тот тоже в списке
У вас есть таблица sales:
CREATE TABLE sales (
salesman_id NUMBER,
region VARCHAR2(50),
amount NUMBER
);
Данные:
| salesman_id | region | amount |
|-------------|------------|--------|
| 101 | 'North' | 200 |
| 101 | 'North' | NULL |
| 102 | 'North' | 150 |
| 103 | 'North' | NULL |
| 104 | 'South' | 300 |
| 105 | 'South' | NULL |
🎯 Задача:
Вывести salesman_id тех продавцов, чья сумма продаж в своём регионе меньше средней по региону, учитывая только те записи, где `amount` не NULL.
Но — обязательно включать продавцов, у которых все продажи NULL, и считать, что их сумма равна 0.
---
### ❗ Подвохы:
- SUM() и AVG() игнорируют NULL, но если у человека *все* значения NULL, SUM вернёт NULL.
- Нужно сравнивать 0 с AVG, а не NULL.
- Надо корректно сгруппировать по региону и учитывать, где NULL'ы не попадают в AVG.
---
✅ Решение:
```sql
SELECT s.salesman_id
FROM (
SELECT
salesman_id,
region,
NVL(SUM(amount), 0) AS total_sales
FROM sales
GROUP BY salesman_id, region
) s
JOIN (
SELECT
region,
AVG(amount) AS avg_region_sales
FROM sales
WHERE amount IS NOT NULL
GROUP BY region
) r
ON s.region = r.region
WHERE s.total_sales < r.avg_region_sales;
```
🧠 Разбор:
1. В подзапросе `s`:
- `SUM(amount)` по продавцу → `NULL`, если продаж нет
- `NVL(..., 0)` превращает такие NULL в 0
2. В подзапросе `r`:
- `AVG(amount)` по региону, игнорируя NULL
- Только валидные продажи участвуют в средней
3. Сравниваем: **продавцы с 0 продаж тоже идут в сравнение**
💡 Вывод:
Этот запрос:
- корректно считает продажи даже для "нулевых" продавцов
- использует `NVL()` и фильтрацию `WHERE amount IS NOT NULL`
- демонстрирует знание поведения агрегатных функций и подзапросов
👀 На собеседованиях часто забывают, что `SUM(NULL)` даёт `NULL`, и сравнение с `AVG` не срабатывает без `NVL`.
@bzd_be1
👣 Stateless Postgres Query Router — это система шардирования для PostgreSQL-кластера, доступная с открытым исходным кодом. Её основной компонент, роутер, анализирует запросы и определяет, на каком конкретном PostgreSQL-кластере следует выполнить транзакцию или запрос.
Ключи шардирования могут передаваться в запросе как явно, так и неявно, в виде комментариев.
В SPQR реализованы функции транзакционного и сессионного пулинга, автобалансировки шардированных таблиц, а также поддержка всех возможных методов аутентификации, сбора статистики и динамической перезагрузки конфигурации.
SPQR поддерживает как запросы к определённому шарду, так и запросы ко всем шардам. В ближайших планах — добавить поддержку двухфазных транзакций и референсных таблиц.
Исходный код SPQR распространяется под лицензией PostgreSQL Global Development Group
⚡️ Ссылки:
🟢https://github.com/pg-sharding/spqr
🟢https://pg-sharding.tech/
@bzd_be1
