Зарегистрируйтесь, чтобы продолжить обучение

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

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

psql

psql: FATAL:  role "tirion" does not exist

Эту проблему можно решить с помощью конструкции sudo -u postgres psql, которую используют в терминале при подключении PostgreSQL. Но это не лучшее решение, по таким причинам:

  • У пользователя postgres есть максимальные права в СУБД. Если завладеть ими, можно все уничтожить. Поэтому приложения или пользователи никогда не создают базы данных от имени postgres и никогда не работают из-под этого пользователя

  • Придется постоянно использовать эту конструкцию sudo -u postgres для любых команд, которые связаны с СУБД. Если у вас MacOS, часть sudo -u postgres использовать не нужно. После установки PostgreSQL автоматически конфигурируется для работы с вашим пользователем

В этом уроке разберем, как создать пользователя и базу данных в СУБД, чтобы psql не выдавал ошибку и все данные были в безопасности. Так мы подготовим PostgreSQL к работе.

Создание пользователя в СУБД

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

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

    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. Сделать это можно из командной строки командой createdb:

# Опция --owner позволяет указать владельца создаваемой базы данных
sudo -u postgres createdb --owner=tirion hexlet
# Если запустить эту команду без аргументов,
# то она попытается создать базу данных,
# которая совпадает с именем вашего пользователя в системе
createdb hexlet

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

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

# Посмотреть список баз данных
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 нужно с осторожностью. Удаление базы данных — необратимый процесс, так как базы невозможно восстановить без резервных копий. Чтобы избежать проблем: команда dropdb не работает без аргументов — ей всегда нужно передавать имя базы.

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

dropdb hexlet
dropdb: error: database removal failed: ERROR:  database "hexlet" is being accessed by other users
DETAIL:  There is 1 other session using the database.

Выводы

В этом уроке мы разобрали, как создать пользователя и базу данных в СУБД. Теперь psql не будет выдавать ошибку и все данные будут в безопасности. Так мы подготовили PostgreSQL к работе.


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

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

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


Дополнительные материалы

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

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

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

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

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

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

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

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

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

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

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

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»