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

Подготовка к работе

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

$ psql
psql: FATAL:  role "tirion" does not exist

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

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

Маководам не нужно использовать часть 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. Инструкция по загрузке есть в описании репозитория.


<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

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

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

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Для полного доступа к курсу нужна профессиональная подписка

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

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

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

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

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

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

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

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

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

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