Практика: Работа с базами данных (PostgreSQL + pgx)
Онлайн редактор кода для Go
Здесь вы можете попробовать свои силы в программировании на языке Go. Для этого мы предоставляем вам онлайн редактор кода, в котором вы можете написать свой код и запустить его.
❗️ При обновлении страницы код пропадёт, по этому, сохраните свой код куда-нибудь, если он важный.
Онлайн редактор кода для PostgreSQL
Здесь вы можете попробовать свои силы в программировании на языке SQL для работы с PostgreSQL. Для этого мы предоставляем вам онлайн редактор кода, в котором вы можете написать свой код и запустить его.
❗️ При обновлении страницы код пропадёт, по этому, сохраните свой код куда-нибудь, если он важный.
Задание 1: Подключение и пул соединений
Задание 1: Подключение к PostgreSQL через pgxpool
Создай файл main.go. Подключись к PostgreSQL с помощью pgxpool.New(). Проверь подключение через Ping(). Настрой пул соединений (MaxConns, MinConns, MaxConnLifetime и т.д.). При успешном подключении выведи красивый стартовый экран.
💡 Подсказка
Используй pgxpool.NewWithConfig() для тонкой настройки.
pool.Config() возвращает настройки — можно вывести их.
Ping() проверяет, что соединение живое.
defer pool.Close() обязателен!
Обрабатывай все ошибки с понятными сообщениями.
Задание 2: Применение миграций через Goose
Задание 2: Миграции базы данных
Установи goose. Создай папку migrations с 2–3 SQL-миграциями (создание таблиц users, posts, comments). В main.go примени миграции через goose.Up(). Выведи статус применения.
💡 Подсказка
goose.Up() применяет все новые миграции.
Файлы миграций: 20240101_create_users.sql с -- +goose Up/Down.
goose сам создаёт таблицу goose_db_version.
Обрабатывай ошибки и выводи понятные сообщения.
Задание 3: Репозиторий блога — CRUD операции
Задание 3: Репозиторий для пользователей и постов
Создай структуры User и Post. Реализуй методы Create, GetByID, List. В main создай тестовые данные (несколько пользователей и постов) и выведи их в красивом виде.
💡 Подсказка
Используй pgxscan или pgx.RowToStructByName.
Для INSERT возвращай ID через RETURNING.
Обрабатывай pgx.ErrNoRows при Get.
Структуры с тегами db:"column_name".
Задание 4: Batch-вставка постов
Задание 4: Batch-вставка — ускоряем импорт
Создай слайс из 100–1000 постов. Реализуй две функции: обычная вставка по одному и batch-вставка через pgx.Batch. Измерь время выполнения и выведи сравнение.
💡 Подсказка
pgx.Batch — очередь команд.
batch.Queue("INSERT ...", args...)
Затем batch.Exec() или pool.SendBatch()
Измеряй время отдельно для каждой версии.
Очищай таблицу перед тестом.
Задание 5: Search in Rotated Sorted Array
Задание 5: Search in Rotated Sorted Array — поиск в повёрнутом массиве (L33)
Дан отсортированный массив, повёрнутый на неизвестное количество позиций, и target. Найди индекс target или -1. Эта задача часто используется при поиске в логах или данных из БД с ротацией.
💡 Подсказка
Эта задача полезна при работе с ротированными логами или индексами в БД.
Решение: модифицированный бинарный поиск.
Определи, какая половина отсортирована, и ищи в нужной.
Обрабатывай случаи с дубликатами осторожно.
Проверь на всех граничных случаях.
Задание 6: Полнотекстовый поиск и теги
Задание 6: Поиск по тегам и полнотекстовый поиск
Добавь в таблицу posts поле tags JSONB и создай GIN-индекс. Реализуй поиск по тегу и полнотекстовый поиск по title+body. Протестируй на реальных данных.
💡 Подсказка
Для тегов: WHERE tags @> '["go"]' или tags && ARRAY['go']
Для FTS: to_tsvector('russian', title || ' ' || body) @@ plainto_tsquery('russian', 'go язык')
GIN индексы создавай в миграциях.
ts_rank и ts_headline для продвинутого поиска.
Задание 7: Median of Two Sorted Arrays — LeetCode 4 (связь с темой)
Задание 7: Median of Two Sorted Arrays — медиана двух массивов (L4)
Даны два отсортированных массива. Найди медиану объединённого массива. Эта задача похожа на слияние данных из разных источников (например, логов из разных серверов).
💡 Подсказка
Эта задача похожа на слияние отсортированных данных из разных источников БД.
Эффективное решение O(log(min(m,n))) — бинарный поиск по разделению.
Простое решение — слияние и поиск медианы (O(m+n)).
Обрабатывай пустые массивы.
Для чётного количества — среднее двух средних.
Задание 8: Транзакции — перевод лайков
Задание 8: Транзакции в действии
Добавь в users поле likes int. Реализуй функцию TransferLikes(fromID, toID, amount int) error в транзакции. Проверь баланс отправителя. Протестируй успешный и неудачный переводы.
💡 Подсказка
tx, err := pool.Begin(ctx)
SELECT likes FROM users WHERE id = $1 FOR UPDATE
Проверка баланса → UPDATE
tx.Commit() или tx.Rollback()
Обрабатывай все ошибки.
Дополнительные материалы
- Попробуй squirrel или sqlc для генерации кода
- Добавь контекст и таймауты в запросы
- Поиграйся с CopyFrom для сверхбыстрой загрузки
- Реализуй пул соединений вручную
pgx + pgxpool — это современный стандарт для работы с PostgreSQL в Go. Используй их везде — получишь скорость, типобезопасность и удобство!
Контекст, отмена и таймауты.