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

Практика: PostgreSQL + pgx


Онлайн редактор кода для Go

Здесь вы можете попробовать свои силы в программировании на языке Go. Для этого мы предоставляем вам онлайн редактор кода, в котором вы можете написать свой код и запустить его.


❗️ При обновлении страницы код пропадёт, по этому, сохраните свой код куда-нибудь, если он важный.

Задание 1 — Простое подключение и ping

Задание 1: Подключение и проверка

⏱️ Примерное время: 10-15 минут

Создай модуль `github.com/ваш-ник/db-cli`. Подключись к PostgreSQL через pgx.Connect и сделай Ping. Выведи статус подключения.


Требования:

  • go mod init github.com/ваш-ник/db-cli
  • функция Connect(ctx context.Context, connStr string) (*pgx.Conn, error)
  • в main: conn, err := Connect(ctx, "postgres://...")
  • defer conn.Close(ctx)
  • conn.Ping(ctx) → "Подключено!" или ошибка

Пример вывода:

Подключение к localhost:5432/db=testdb...
Успешно подключено к PostgreSQL!

Задание 2 — Пул соединений + простая выборка

Задание 2: Пул + выборка пользователей

⏱️ Примерное время: 20-25 минут

Создай пул pgxpool. Напиши функцию GetUsers(pool *pgxpool.Pool) ([]User, error). Верни всех пользователей из таблицы users.


Требования:

  • структура internal/models/user.go: type User struct { ID int; Username string; ... }
  • pkg/db/db.go: var Pool *pgxpool.Pool; func InitPool(connStr string) error
  • функция GetUsers(ctx context.Context) ([]*User, error)
  • используй pool.Query + rows.Scan
  • обработай pgx.ErrNoRows

Пример вывода:

Пользователи:
1 | alice | alice@example.com | 2025-01-01
2 | bob | bob@example.com | 2025-02-15

Задание 3 — CRUD-операции с пользователями

Задание 3: Полный CRUD для пользователей

⏱️ Примерное время: 25-35 минут

Реализуй UserRepository с методами: Create, GetByID, Update, Delete, List. Используй транзакции для Create+Update.


Требования:

  • internal/repository/user.go: type UserRepository struct { pool *pgxpool.Pool }
  • методы: Create(ctx, user *User) error, GetByID(ctx, id int) (*User, error), Update(ctx, user *User) error, Delete(ctx, id int) error, List(ctx, limit, offset int) ([]*User, error)
  • Create и Update — в транзакции
  • обработай pgx.ErrNoRows

Пример вывода:

Создан пользователь: ID=100, username=artem
Получен: ID=100, username=artem, email=artem@example.com
Обновлено: email → new@email.com
Удалён пользователь ID=100

Задание 4 — JSONB и массивы в PostgreSQL

Задание 4: Работа с JSONB и массивами

⏱️ Примерное время: 25-35 минут

Создай таблицу user_profiles (user_id, settings jsonb, tags text[]). Реализуй сохранение и чтение профиля.


Требования:

  • структура UserProfile { UserID int; Settings map[string]any; Tags []string }
  • SaveProfile(ctx, profile *UserProfile) error → INSERT/ON CONFLICT UPDATE
  • GetProfile(ctx, userID int) (*UserProfile, error)
  • pgx автоматически сериализует map в JSONB и []string в text[]

Пример вывода:

Сохранён профиль user_id=1
Настройки: map[theme:dark notifications:true]
Теги: [admin developer]

Задание 5 — Batch и CopyFrom: массовая загрузка

Задание 5: Массовая загрузка данных

⏱️ Примерное время: 35-50 минут

Сгенерируй 1000–5000 пользователей и загрузи их в таблицу двумя способами: pgx.Batch и CopyFrom. Сравни время.


Требования:

  • функция GenerateUsers(n int) []User
  • BatchInsert(ctx, users []User) error → pgx.Batch
  • CopyInsert(ctx, users []User) (int64, error) → pgx.CopyFrom
  • замерь время выполнения обоих методов
  • логируй через slog: время, количество строк

Пример вывода:

Сгенерировано 5000 пользователей
Batch: 2.45 сек, 5000 строк
CopyFrom: 0.38 сек, 5000 строк
CopyFrom быстрее в 6.4 раза!

Задание 6 — Итоговое: CLI-утилита для работы с БД

Задание 6: CLI-утилита для управления пользователями (итоговое)

⏱️ Примерное время: 50-80 минут

Создай CLI-утилиту `db-cli` с командами: add-user, list-users, get-user, update-user, delete-user, import-users (CSV), stats. Используй многослойную структуру.


Требования:

  • структура проекта как в лекции + cmd/db-cli/main.go
  • флаги/аргументы через flag или cobra (по желанию)
  • слои: internal/config, internal/models, internal/repository, pkg/logger, pkg/utils
  • миграция через goose (create_users_table)
  • импорт CSV через CopyFrom
  • статистика: count, avg, top-5 и т.д.

Пример запуска:

db-cli add-user --username artem --email artem@example.com
db-cli list-users --limit 10
db-cli import-users users.csv
db-cli stats

Это задание — полноценная CLI-утилита для работы с PostgreSQL, готовая к использованию в реальных проектах.

подсказка

PostgreSQL + pgx — это комбо, которое используют почти все серьёзные Go-проекты в 2026 году.
Пул соединений, транзакции, CopyFrom и goose-миграции — must-have для любого бэкенда.