Rails и PostgreSQL: роль postgres не существует

106

Я установил PostgreSQL на свой Mac OS Lion и работаю над приложением rails. Я использую RVM, чтобы хранить все отдельно от других моих приложений Rails.

По какой-то причине, когда я пытаюсь перенести db в первый раз, rake не может найти пользователя postgres. Я получаю ошибку

 FATAL:  role "postgres" does not exist

У меня есть pgAdmin, поэтому я ясно вижу, что в базе данных есть пользователь postgres - фактически учетная запись администратора - поэтому я не уверен, что еще делать.

Я где-то читал о людях, у которых возникают проблемы с PostgreSQL из-за того, по какому пути он был установлен, но не думаю, что я бы зашел так далеко, если бы он не смог найти базу данных.

Адам
источник
Для тесно связанной проблемы, когда пользователь БД (= роль) postgresне был создан, что может привести к тому же сообщению об ошибке, см. Соответствующий вопрос: stackoverflow.com/questions/11919391/…
Эрвин Брандштеттер

Ответы:

12

Это сообщение появляется, когда пользователь базы данных не существует. Сравните руководство здесь .
Множественные локальные базы данных не могут быть объяснением. Роли действительны для всего кластера. Руководство снова :

Обратите внимание, что роли определены на уровне кластера базы данных, поэтому они действительны для всех баз данных в кластере.

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

Может быть, сообщение действительно пришло с удаленного сервера?

Эрвин Брандштеттер
источник
Вот и все - у меня возникли проблемы с запуском postgresql в период работы, поэтому я сделал новую установку, поэтому сейчас у меня должна быть пара экземпляров. Однако изменил порт в файле database.yml, и все заработало. Спасибо за вашу помощь!
Адам
не работал даже после очистки всех изображений - docker rmi $(docker images -q) --force. но вопрос был на volumesя догадываюсь
prayagupd
267

На самом деле, по какой-то неизвестной причине я обнаружил, что проблема на самом деле связана с тем, что роль postgresql не была создана.

Попробуйте запустить:

createuser -s -r postgres

Обратите внимание, что роли - это способ, которым PostgreSQL поддерживает разрешения базы данных . Если у пользователя postgres нет роли, то он ни к чему не может получить доступ. Команда createuser представляет собой тонкую оболочку для команд CREATE USER, CREATE ROLE и т. Д.

Крис Шерлок
источник
8
Мне пришлось использовать, sudo su - postgresпрежде чем эта команда сработала для меня. Спасибо!
Коннор Лич
2
Не знаю, как возникла моя настройка, но у меня был postgresql, созданный без пользователя и роли postgres, myUser как единственный пользователь, но я отказался впустить меня под предлогом того, что база данных с именем myUser не существует! это разгаданная часть хаоса!
Джером
@StuartNelson: Похоже, это решение общей проблемы ( здесь то же самое ). Но это явно не ответ на этот вопрос. ОП четко заявляет, что роль существовала в его БД.
Эрвин Брандштеттер,
За исключением того, что вы объединяете роли с пользователями. Пользователь существовал, а роли нет - он четко говорит, что существует пользователь , а не роль.
Крис Шерлок
-rВариант не является необходимым с -sопцией. Суперпользователь включает атрибут «Создать роль».
Деннис
26

Недавно у меня возникла эта проблема сразу после установки postgres. Если он приходит сразу после установки, возможно, вам не хватает пользователя по умолчанию, postgres. В этом случае вы можете создать postgres пользователя по умолчанию, используя команду ниже.

createuser -s -U $ ПОЛЬЗОВАТЕЛЬ

Ex: createuser -s -U $USER
enter your required role name: postgres
enter password for your the user: 

Вам будет предложено ввести требуемое имя роли и пароль базы данных. После завершения процесса вы можете войти в консоль postgres, используя команду ниже

psql -U 'your_database_name'

Пример: psql -U postgres
Здесь вам нужно ввести пароль, если вы его указали при создании пользователя.

Надеюсь, поможет :)

Прем
источник
22

Я был на OSX 10.8, и все, что я пробовал, давало мне FATAL: role "USER" does not exist. Как многие здесь говорили, беги createuser -s USER, но это дало мне ту же ошибку. Это наконец сработало для меня:

$ sudo su
# su postgres
# createuser -s --username=postgres MYUSERNAME

createuser -s --username=postgresСоздает суперпользователя (флаг -s) путем подключения, Postgres (--username = POSTGRES флаг).

Я вижу, что на ваш вопрос был дан ответ, но я хочу добавить этот ответ для людей, использующих OSX и пытающихся установить PostgreSQL 9.2.4.

разъем
источник
2
Вы можете сократить первые две строки до sudo su postgres.
6ft Dan
Это также было решением для меня на ubuntu, не забудьте обновить свой database.yml, чтобы использовать то же имя пользователя, что и выше
Crobicha
10

Я столкнулся с этой проблемой сразу, когда впервые установил POSTGRES.app от Heroku. После одного утреннего проб и ошибок я думаю, что эта одна строка кода решила проблему. Как описано ранее, это связано с тем, что postgresql не имеет роли по умолчанию при первой настройке. И нам нужно это установить.

sovanlandy=# CREATE ROLE postgres LOGIN;

Вы должны войти в соответствующую консоль psql, чтобы использовать эту команду psql.

Также обратите внимание, что если вы уже создали роль postgre, но по-прежнему получаете ошибки разрешения, вам необходимо изменить с помощью команды:

sovanlandy=# ALTER ROLE postgres LOGIN;

Надеюсь, поможет!

Sovanlandy
источник
4

В документации Heroku; Начинаю с рельсов 4, мол:

Вам также необходимо удалить поле имени пользователя в файле database.yml, если оно есть: В файле config / database.yml remove: username: myapp

Затем вы просто удаляете эту строку в "development:", если вы не pg сообщает базе данных, которая работает под ролью "myapp"

Эта строка сообщает rails, что база данных myapp_development должна запускаться под ролью myapp. Поскольку у вас, скорее всего, нет этой роли в вашей базе данных, мы удалим ее. Со строкой remove Rails попытается получить доступ к базе данных как пользователь, который в данный момент вошел в систему.

Также не забудьте создать базу данных для разработки:

$createdb myapp_development

Замените myapp в названии вашего приложения

Юнрок
источник
2

Могли бы вы иметь несколько локальных баз данных? Проверьте свой database.ymlи убедитесь, что вы попадаете на нужный pg db. Используйте rails consoleдля подтверждения.

Джонатан Джулиан
источник
2

Процедура установки создает учетную запись пользователя, postgresкоторая связана с ролью Postgres по умолчанию. Чтобы использовать Postgres, вы можете войти в эту учетную запись. Но если это не указано явно, приложение rails ищет другую роль, в частности роль, имеющую ваше имя пользователя unix, которая может не быть создана в ролях postgres.

Чтобы преодолеть это, вы можете создать новую роль, сначала переключившись на роль postgres по умолчанию, которая была создана во время установки.

sudo -i -u postgres

После входа в учетную запись postgres вы можете создать нового пользователя с помощью команды:

createuser --interactive

Это предложит вам несколько вариантов выбора и, на основе ваших ответов, выполните правильные команды Postgres для создания пользователя.

Передайте имя роли и некоторые разрешения, и роль будет создана, затем вы можете перенести свой db

Mayur
источник
1

Мой ответ был намного проще. Просто зашел в папку db и удалил столбец id, который я пытался принудительно создать, но который на самом деле создается автоматически. Я также удалил ИМЯ ПОЛЬЗОВАТЕЛЯ в файле database.yml (в папке config).

Maudulus
источник
1

В командной строке локального пользователя Ubuntu, но не пользователя root, введите

sudo -u postgres createuser имя пользователя

имя пользователя выше должно совпадать с именем, указанным в сообщении «FATAL: роль 'имя пользователя' не существует».

Введите пароль для имени пользователя.

Затем повторно введите команду, что сгенерированное сообщение роли не существует.

Роберт Камбил
источник
0

Я оказался здесь после попытки следовать руководству Райана Бэйта по развертыванию на AWS EC2 с помощью Rubber. Вот что со мной произошло: мы создали новое приложение, используя "

rails new blog -d postgresql

Очевидно, это создает новое приложение с pg в качестве базы данных, но база данных еще не была создана. С sqlite вы просто запускаете rake db: migrate, однако с pg вам нужно сначала создать базу данных pg. Райан не сделал этого шага. Команда rake db:create:all, тогда мы можем запуститьrake db:migrate

Вторая часть - это изменение файла database.yml. По умолчанию имя пользователя при создании файла - appname. Однако есть вероятность, что ваша роль администратора postgresql отличается (по крайней мере, для меня). Я изменил его на свое имя (см. Выше совет по созданию имени роли), и все готово.

Надеюсь это поможет.

Эндрю Шенстон
источник
0

После кучи установки и удаления Postgres вот что, похоже, теперь стабильно работает для меня с Os X Mavericks, Rails 4 и Ruby 2.

  1. В файле database.yml я меняю имена пользователей по умолчанию на имя пользователя моего компьютера, которое для меня просто «admin».

  2. В командной строке запускаю rake db: create: all

  3. Затем я запускаю rake db: migrate

  4. Когда я запускаю сервер rails и проверяю локальный хост, он говорит: «Добро пожаловать на борт».

Майкл ван Холст
источник
0

Возможно, вы сможете обойти это, запустив initdb -U postgres -D /path/to/dataили запустив его как пользовательский postgres, поскольку по умолчанию он используется для текущего пользователя. GL!

Роджердпак
источник