Вспомним, как работает psql. Если эту программу запустить без аргументов, то она пытается подключиться к локальной базе данных (находящейся на той же машине) с именем, совпадающим с именем текущего пользователя, и делает это, используя роль с этим же именем. Если PostgreSQL установлен верно, то запуск этой программы в Linux (например, Ubuntu) ругается на отсутствие соответствующей роли:
$ psql
psql: FATAL: role "tirion" does not exist
Мы уже научились решать эту проблему, используя sudo -u postgres psql. Но это не лучшее решение, как минимум, по двум причинам:
Маководам не нужно использовать часть sudo -u postgres, так как после установки PostgreSQL автоматически конфигурируется для работы с вашим пользователем
Для упрощения работы по ходу курса создадим роль, которая имеет такое же имя, как и пользователь, из под которого вы работаете. Выполните следующие действия:
Посмотрите имя вашего текущего пользователя: whoami
$ whoami
tirion
Создайте роль с таким же именем внутри 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, то СУБД предупредит о невозможности выполнить команду.
Процесс создания пользователя и базы данных
Для дальнейших уроков нам понадобится база данных из репозитория pg-dump-example. Всё, что от вас требуется сейчас — загрузить её в базу данных под именем hexlet. Инструкция по загрузке есть в описании репозитория.
Вам ответят команда поддержки Хекслета или другие студенты.
Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.
Загляните в раздел «Обсуждение»:
Профессиональная подписка откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
Зарегистрируйтесь или войдите в свой аккаунт