Перейти к основному содержимому

Практика: Работа с базами данных (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. Используй их везде — получишь скорость, типобезопасность и удобство!

Следующий урок

Контекст, отмена и таймауты.