Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Подготовка к работе Основы реляционных баз данных

Вспомним, как работает psql. Если эту программу запустить без аргументов, то она пытается подключиться к локальной базе данных (находящейся на той же машине) с именем, совпадающим с именем текущего пользователя, и делает это, используя роль с этим же именем. Если PostgreSQL установлен верно, то запуск этой программы в Linux (например, Ubuntu) ругается на отсутствие соответствующей роли:

psql

psql: FATAL:  role "tirion" does not exist

Мы уже научились решать эту проблему, используя sudo -u postgres psql. Но это не лучшее решение, как минимум, по двум причинам:

  1. Пользователь postgres имеет максимальные права в СУБД. Тот, кто завладеет им, может уничтожить всё. Поэтому конкретные клиенты (приложения или пользователи) никогда не создают базы данных от имени postgres и никогда не работают из под этого пользователя.
  2. Придётся постоянно использовать эту конструкцию sudo -u postgres для любых команд, связанных с СУБД.

Если у вас MacOS, часть sudo -u postgres использовать не нужно, так как после установки PostgreSQL автоматически конфигурируется для работы с вашим пользователем

Для упрощения работы по ходу курса создадим роль, которая имеет такое же имя, как и пользователь, из под которого вы работаете. Выполните следующие действия:

  1. Посмотрите имя вашего текущего пользователя: whoami

    whoami
    
    tirion
    
  2. Создайте роль с таким же именем внутри PostgreSQL, используя команду createuser. Обратите внимание на то, что команду нужно запускать от пользователя postgres, иначе она попробует соединиться с СУБД от имени текущего пользователя, которого там нет:

    # Флаг --createdb добавляет нашей роли возможность создавать базы данных. По умолчанию этой возможности нет.
    sudo -u postgres createuser --createdb tirion
    
    # Для удаления пользователя можно воспользоваться командой:
    dropuser tirion
    

Теперь у нас есть роль в СУБД. Попробуем соединиться с PostgreSQL, используя её:

psql

psql: FATAL:  database "tirion" does not exist

Снова ошибка, но уже другая. Теперь psql ругается на то, что не выбрана база данных. Надо сказать что невозможно соединиться с СУБД просто так: соединение всегда происходит с конкретной базой данных. Эту базу данных можно указать самостоятельно, просто передав один аргумент в psql. Мы уже знаем, что внутри PostgreSQL создана база postgres. Попробуем подключиться к ней:

psql postgres

postgres=>

Соединение удалось. Теперь посмотрим список ролей. Для этого подходит команда \du (Describe Users), которую надо выполнить внутри REPL.

postgres=> \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 tirion    | Create DB                                                  | {}

Как видно, в СУБД создано две роли. Одна postgres, другая — та, которую мы самостоятельно добавили ранее.

Для экспериментов нам понадобится база данных и, возможно, даже не одна. Создадим базу данных с именем hexlet. Сделать это можно из командной строки (не репла psql!) командой createdb.

# Если запустить эту команду без аргументов,
# то она попытается создать базу данных,
# совпадающую с именем вашего пользователя в системе.
createdb hexlet

Имя для базы данных выбирается произвольно и обычно совпадает с названием проекта, для которого она создается. Имена баз уникальны в рамках одной СУБД. Это значит, что повторный вызов createdb с тем же именем приведёт к ошибке.

После установки, PostgreSQL сразу создаёт несколько служебных баз данных (например, postgres), которые нужны для работы самой СУБД.

# Посмотреть список баз данных
psql -l

# Не полный вывод
                          List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |
-----------+----------+----------+-------------+-------------+
 pgadmin   | pgadmin  | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 tirion    | tirion   | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |

Теперь у нас есть роль и база данных для экспериментов. Подключение к этой БД выполняется так:

psql hexlet

hexlet=>

Созданную базу данных можно удалить командой dropdb:

dropdb hexlet

Не забудьте её снова создать, так как она понадобится нам в дальнейшем.

Запускать такую команду нужно с большой осторожностью. Удаление базы данных — необратимый процесс. Нет ничего страшнее, чем потерять данные, которые, в отличие от кода, невозможно восстановить без резервных копий. Во избежание недоразумений, команда dropdb не работает без аргументов — ей всегда нужно передавать имя базы.

Удаление базы данных возможно только в том случае, если к ней никто не подключен (за исключением того, кто удаляет). Если есть другие клиенты, например psql или pgadmin4, то СУБД предупредит о невозможности выполнить команду.

Процесс создания пользователя и базы данных


Самостоятельная работа

  • Создайте роль с именем hexletbot
  • Создайте базу данных с именем hexletbot
  • Удалите созданную базу данных

В дальнейшем нам понадобится база данных из репозитория pg-dump-example. Всё, что от вас требуется сейчас — загрузить её в базу данных под именем hexlet. Инструкция по загрузке есть в описании репозитория.


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
30 июня 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
30 июня 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
30 июня 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
30 июня 16 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
30 июня 10 месяцев

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»