Files
de-roadmap/postgres-bookings/README.md

122 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Postgres + demoDB "bookings" в Docker
Этот стенд поднимает локальный PostgreSQL в Docker и загружает учебную БД **Postgres Pro demo “Airlines/Bookings”**. После запуска можно работать через `psql` (внутри контейнера) и через DBeaver (с хоста).
---
## Что нужно заранее
- **Docker Desktop** (Windows/macOS) или **Docker Engine** (Linux) + **docker compose**.
- Утилита `unzip` (Linux: `sudo apt install unzip` / `sudo dnf install unzip`).
- Свободный порт **5432** (или задайте другой через `.env`).
- Windows: желательно запускать команды в **WSL2** либо в **Git Bash** (так проще с shell‑скриптами и LF‑окончаниями).
Проверка окружения:
```bash
docker --version
docker compose version
```
---
## Структура проекта
> Важно: файлы 00_init.sql и 01_bookings.sql создаются скриптом download_db.sh и изначально отсутствуют.
```
postgres-bookings/
├─ docker-compose.yml
├─ download_db.sh # скрипт скачивания и подготовки демо-БД
├─ .env # опционально: логин/пароль/порт
├─ initdb/ # изначально пусто
└─ psql_sh # помощник: открыть psql внутри контейнера
```
После выполнения шага «Быстрый старт → п.1» в initdb/ появятся:
```
initdb/
├─ 00_init.sql # создаёт БД demo (страхует первый запуск)
└─ 01_bookings.sql # учебные данные Postgres Pro
```
---
## Быстрый старт (Linux/macOS/WSL2)
1) Скачать и подготовить демо‑БД:
```bash
bash download_db.sh
chmod +x psql_sh
```
2) Запустить кластер:
```bash
docker compose up -d
```
3) Проверить статус и подключиться к psql:
```bash
docker compose ps
./psql_sh
```
Внутри `psql` можно проверить данные:
```sql
\dt;
SELECT COUNT(*) FROM bookings.flights;
```
---
## Подключение из DBeaver
- Host: 127.0.0.1
- Port: 5432 (или ваш из .env)
- Database: demo
- User: postgres
- Password: postgres
- SSL: Off
---
## Частые команды
```bash
# запустить в фоне / остановить
docker compose up -d
docker compose down
# статус и логи
docker compose ps
docker compose logs -f --tail=200
# открыть psql
./psql_sh
```
---
## Сброс и повторная заливка
> Автозагрузка из `initdb/` выполняется **только** при первом старте с пустым томом данных.
- Полный сброс и переинициализация:
```bash
docker compose down -v && docker compose up -d
```
- Перезалить данные без удаления тома:
```bash
docker compose exec -T db psql -U postgres -d postgres \
-f /docker-entrypoint-initdb.d/01_bookings.sql
```
---
## Частые проблемы и решения
- **Порт 5432 занят.** Поменяйте `PG_PORT` в `.env`, затем `docker compose down && docker compose up -d`.
- **`./psql_sh: Permission denied`.** Дайте права: `chmod +x psql_sh`.
- **`psql: could not connect to server` / статус не `healthy`.** Смотрите логи: `docker compose logs -f --tail=200`.
- **Windows и CRLF.** Если редактировали файлы Блокнотом, убедитесь в LF‑окончаниях (используйте Git Bash/WSL2).
- **`unzip: command not found` (Linux).** Установите `unzip` командой дистрибутива.
---
## Зачем нужен `00_init.sql`?
Учебный скрипт `01_bookings.sql` начинается с `DROP DATABASE demo;` (без `IF EXISTS`). На самом первом запуске БД `demo` ещё нет, поэтому `DROP` вызвал бы ошибку. Файл `00_init.sql` предварительно создаёт БД `demo`, чтобы импорт прошёл без сбоев.
---
## Что внутри демо‑БД
Схема `bookings`: таблицы `airports`, `aircrafts`, `flights`, `tickets`, `ticket_flights`, `boarding_passes` и др. Идеально для практики `JOIN`, оконных функций, индексов и анализа планов (`EXPLAIN ANALYZE`).
> **Безопасность:** значения по умолчанию (`postgres/postgres`) — только для учебных целей на локальной машине. Для реальных проектов используйте сильные пароли и SSL.