Локальный PostgreSQL и первая учебная база
Анна ведёт библиотеку небольшого клуба в таблице на ноутбуке. Борис хочет добавить выдачу с другого компьютера, а Вера — посмотреть свободные экземпляры через будущий сайт. Если каждый хранит собственный файл, копии начинают расходиться. Мы перенесём факты в один сервер PostgreSQL и научимся обращаться к нему через клиент. На этом шаге Go ещё не нужен: сначала проверим данные непосредственно.
Кто хранит данные и кто задаёт вопросы
Сервер PostgreSQL принимает соединения, исполняет SQL и хранит данные. psql — клиент командной строки: он отправляет команды серверу и показывает ответы. Закрытие окна psql не удаляет базу. Установить клиент недостаточно, чтобы появился работающий сервер; ошибка соединения поэтому не означает ошибку будущего SELECT. Сервер должен быть запущен и слушать адрес либо локальный сокет.
Один установленный сервер может обслуживать несколько баз. База отделяет набор объектов и доступ к ним. Внутри базы схема объединяет таблицы под именем: club.members означает таблицу members схемы club. Это не каталог фотографий и не файл Go. Роль PostgreSQL определяет, кто подключается и какие действия разрешены. Роль базы не обязательно совпадает с пользователем операционной системы, хотя локальная установка может настроить такое соответствие.
На дату подготовки стабильная ветка — PostgreSQL 18; документация current указывает 18.6, а 19 находится в разработке. Используйте последний исправленный выпуск ветки 18. Бесплатный установщик или пакет выбирается на официальной странице загрузки. Для Windows доступен установщик, для macOS и Linux — несколько способов. Следуйте инструкции своей ОС: одинаковая команда запуска службы для всех машин здесь была бы выдумкой. Docker допустим, если уже знаком, но весь курс выполняется и с обычной установкой.
Проверяем подключение
После установки проверьте клиента и подключение к обслуживающей базе. Значение host, порт и имя роли возьмите из своей локальной настройки. Обычный порт — 5432, однако совпадение номера не доказывает, что сервер работает. Пароль не сохраняйте в репозитории и не присылайте в отчёте.
psql --version
psql -h localhost -U your_local_role -d postgresПервый вызов показывает версию клиента, второй открывает соединение. Если подключение отвергнуто, сначала уточните, запущен ли сервер и правильны ли адрес, порт и credentials. Не исправляйте connection refused созданием индекса. Внутри psql команды SQL заканчиваются точкой с запятой; команды клиента начинаются обратной косой чертой.
SELECT current_database(), current_user;
SELECT 2 + 3 AS answer;Вторая команда возвращает одну строку с answer=5. Первая показывает реальное имя базы и роли: запишите их, чтобы не перепутать учебную среду с другой. \conninfo сообщает детали соединения, \q выходит из клиента. Если приглашение изменилось и команда не исполняется, проверьте закрывающую кавычку и точку с запятой. Пока команда не отправлена, \r очищает набранный буфер.
Создаём только новую базу
Скачайте комплект лабораторий, распакуйте его и прочитайте README. Создайте новое имя, которого ещё нет на вашем локальном сервере. В примере используется db_course_library_2026; при совпадении выберите другой суффикс. Отказ создания нельзя трактовать как разрешение использовать уже существующую базу.
createdb -h localhost -U your_local_role db_course_library_2026
export DB_LAB_URL='postgresql://your_local_role@localhost/db_course_library_2026'
psql "$DB_LAB_URL" -f setup.sql
psql "$DB_LAB_URL" -f tests.sqlКоманда export предназначена для shell с таким синтаксисом, например bash/zsh. В PowerShell можно передать URI напрямую аргументом psql или определить $env:DB_LAB_URL. URI здесь предполагает отдельно настроенный пароль/локальную аутентификацию; не вставляйте пароль в общедоступную командную историю. Если вашей роли нельзя создавать базы, создайте новую учебную базу через локальную административную роль и подключайтесь согласно своей настройке.
Setup включает остановку при SQL-ошибке и одну транзакцию. Он создаёт новую схему club без автоматического переиспользования старой. Если такая схема уже существует, выполнение прекращается и незавершённый setup откатывается. Ни DROP, ни очистки прежних объектов нет. Повторный setup требует новой базы. Тесты меняют только собственные учебные строки и откатывают изменения; они не заменяют безопасный выбор адреса.
SELECT COUNT(*) AS members_count FROM club.members;
SELECT COUNT(*) AS loans_count FROM club.loans;На исходном наборе оба результата равны 3. Есть также 3 книги и 4 физических экземпляра. Анна держит два экземпляра «Практики Go», Борис уже вернул «Запросы SQL», Вера ничего не брала. Даты фиксированы, поэтому дальнейшие ответы не зависят от сегодняшнего календаря.
Самостоятельная лаборатория
Отведите 25–45 минут. Установите сервер, создайте свою новую базу, выполните setup и тесты. Сохраните версию клиента/сервера, ответ current_database/current_user и четыре количества таблиц. Затем откройте второе окно psql к той же базе и повторите COUNT. Первое окно можно закрыть: данные останутся.
Критерии готовности: вы различаете клиент и сервер; можете показать адрес именно новой базы; четыре количества равны 3,3,4,3; знаете, почему нельзя продолжать setup после collision. SQL в комплекте имеет ожидаемые результаты, а реальное выполнение на вашей машине подтверждается transcript. Ошибку установки нельзя скрывать утверждением, что урок пройден.
Разбор
Два клиента видят одни и те же сохранённые факты, потому что обращаются к одной базе. Это ещё не проверка конкурентной правильности: пока запросы только читают. Ошибка роли отличается от отсутствующей таблицы: первая возникает при аутентификации или проверке права, вторая — при обращении к объекту уже подключённой базы. В следующем уроке выясним, какие строки база вообще допускает сохранить.
Первичные источники
PostgreSQL: Tutorial, политика поддерживаемых версий, создание базы. Имена, dataset и лаборатория курса оригинальные.