Skip to content

extekky/dblabs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SQL Labs — PostgreSQL 17

Локальная среда для лабораторных работ по SQL на базе PostgreSQL 17 в Docker-контейнере.

Стек

OrbStack движок контейнеров на macOS
PostgreSQL 17 СУБД внутри контейнера
DBeaver GUI-клиент
VSCode редактор + терминал

Структура проекта

dblabs/
├── .env                    # параметры подключения и имена
├── DUMPCHANGE.md           # какие правки нужны для скачанного дампа
├── demodb.sql              # распакованный и подготовленный дамп Postgres Pro
├── docker-compose.yaml
└── scripts/                # SQL-скрипты для практики
    └── .gitkeep

Быстрый старт

1. Убедись что OrbStack работает

docker version

В выводе должны быть и Client, и Server. Если нет — открой OrbStack.

2. Перейди в проект

cd ~/projects/dblabs

В корне проекта лежат docker-compose.yaml, .env и DUMPCHANGE.md.

3. Подготовь demodb.sql

Скачай SQL-дамп учебной базы с сайта Postgres Pro:

https://postgrespro.ru/education/demodb

Распакуй скачанный архив и переименуй SQL-файл в:

demodb.sql

Положи demodb.sql в корень проекта рядом с docker-compose.yaml.

После этого примени к demodb.sql изменения, описанные в DUMPCHANGE.md. Для текущего проекта из дампа нужно убрать команды уровня базы данных (DROP DATABASE, CREATE DATABASE, \connect demo), потому что Docker Compose сам создаёт базу demo из .env, а init-скрипт должен только наполнить её схемой bookings и данными.

demodb.sql не хранится в репозитории: файл большой, поэтому он добавлен в .gitignore.

4. Проверь .env

cat .env

По умолчанию:

POSTGRES_DB=demo
POSTGRES_USER=student
POSTGRES_PASSWORD=student123
POSTGRES_PORT=5432
POSTGRES_CONTAINER_NAME=dblabs

Для дампа demodb.sql рабочая база называется demo, поэтому POSTGRES_DB в .env тоже должен быть demo. Docker создаёт эту базу до запуска init-скрипта, а сам скрипт наполняет её схемой bookings.

5. Запусти контейнер

docker compose up -d

Первый запуск скачает образ postgres:17 (~150 МБ). Дальнейшие запуски мгновенны.

Init-скрипт demodb.sql выполняется только при создании пустого volume pgdata. Если контейнер уже запускался и нужно повторить импорт с нуля, сначала удали старые данные:

docker compose down -v

Проверь статус:

docker compose ps

Ожидаемый результат — статус Up (healthy):

NAME               STATUS          PORTS
dblabs             Up (healthy)    0.0.0.0:5432->5432/tcp

6. Подключись в DBeaver

New Database Connection -> PostgreSQL и заполни поля:

Поле Значение
Host localhost
Port 5432
Database demo
Username student
Password student123

Нажми Test Connection — должно появиться Connected, затем Finish.

При первом подключении DBeaver предложит скачать JDBC-драйвер PostgreSQL — соглашайся.

7. Проверь через терминал (опционально)

docker compose exec postgres psql -U student -d demo
SELECT version();
\q

Команды

# запустить
docker compose up -d

# остановить (данные сохраняются)
docker compose stop

# остановить и удалить контейнер (данные в volume остаются)
docker compose down

# удалить контейнер И все данные — чистый старт
docker compose down -v

# логи
docker compose logs postgres

# перезапустить
docker compose restart

psql внутри контейнера

docker compose exec postgres psql -U student -d demo

Полезные мета-команды psql:

\l            список всех баз данных
\dt           список таблиц в текущей БД
\d имя        структура таблицы
\timing       показывать время выполнения запросов
\e            открыть запрос в редакторе
\q            выйти

SQL-скрипты (scripts/)

Папка scripts/ предназначена для ручной практики: здесь можно хранить запросы, схемы таблиц, вставку тестовых данных и решения упражнений.

Пример scripts/01_employees.sql:

CREATE TABLE employees (
    id     SERIAL PRIMARY KEY,
    name   VARCHAR(100) NOT NULL,
    dept   VARCHAR(50),
    salary NUMERIC(10, 2)
);

INSERT INTO employees (name, dept, salary) VALUES
    ('Иван Петров',    'IT',      90000),
    ('Анна Смирнова',  'HR',      60000),
    ('Пётр Иванов',    'IT',      95000),
    ('Мария Кузнецова','Finance', 75000);

Выполнить скрипт внутри базы можно так:

docker compose exec -T postgres psql -U student -d demo < scripts/01_employees.sql

Или зайти в psql и выполнять запросы руками:

docker compose exec postgres psql -U student -d demo

Volume и данные

Данные PostgreSQL хранятся в named volume pgdata. Он переживает docker compose down — удаляется только с флагом -v.

# посмотреть все тома
docker volume ls

# удалить том вручную
docker volume rm dblabs_pgdata

Имя тома в системе формируется как <папка_проекта>_pgdata, например dblabs_pgdata.


Частые проблемы

Порт 5432 занят

lsof -i :5432

Измени POSTGRES_PORT в .env (например на 5433) — и укажи тот же порт в DBeaver.

Контейнер не поднимается

docker compose logs postgres

Статус starting не меняется на healthy

Подожди 10–15 секунд. Если не помогает — смотри логи выше.

About

PostgreSQL 17 playground for learning and practicing SQL with Docker Compose

Resources

Stars

Watchers

Forks

Contributors