Rails et PostgreSQL: le rôle postgres n'existe pas

106

J'ai installé PostgreSQL sur mon Mac OS Lion et je travaille sur une application de rails. J'utilise RVM pour que tout soit séparé de mes autres applications Rails.

Pour une raison quelconque, lorsque j'essaye de migrer la base de données pour la première fois, rake ne trouve pas l'utilisateur postgres. J'obtiens l'erreur

 FATAL:  role "postgres" does not exist

J'ai pgAdmin donc je peux clairement voir qu'il y a un utilisateur postgres dans la base de données - le compte administrateur en fait - donc je ne sais pas quoi faire d'autre.

J'ai lu quelque part sur des personnes ayant des problèmes avec PostgreSQL à cause du chemin dans lequel il a été installé, mais je ne pense pas que j'aurais été aussi loin s'il ne pouvait pas trouver la base de données.

Adam
la source
Pour le problème étroitement lié où l'utilisateur de base de données (= rôle) postgresn'a pas été créé, ce qui peut conduire au même message d'erreur, voir cette question connexe: stackoverflow.com/questions/11919391/…
Erwin Brandstetter

Réponses:

12

Ce message apparaît lorsque l'utilisateur de la base de données n'existe pas. Comparez le manuel ici .
Plusieurs bases de données locales ne peuvent pas être l'explication. Les rôles sont valides à l'échelle du cluster. Le manuel encore :

Notez que les rôles sont définis au niveau du cluster de bases de données et sont donc valides dans toutes les bases de données du cluster.

Vous devez vous retrouver dans un autre cluster de bases de données . Ce serait un autre serveur fonctionnant sur la même machine, écoutant un port différent. Ou, plus probablement, sur une machine différente.

Se pourrait-il que le message provienne, en fait, du serveur distant?

Erwin Brandstetter
la source
C'était tout - j'ai eu du mal à faire fonctionner postgresql, donc j'ai fait une nouvelle installation, donc je dois avoir quelques exemples ici maintenant. J'ai changé le port dans le fichier database.yml et tout a bien fonctionné. Merci de votre aide!
Adam
n'a pas fonctionné même après avoir nettoyé toutes les images - docker rmi $(docker images -q) --force. mais le problème était sur volumesje suppose
prieragupd
267

En fait, pour une raison inconnue, j'ai trouvé que le problème était en fait parce que le rôle postgresql n'avait pas été créé.

Essayez de courir:

createuser -s -r postgres

Notez que les rôles sont la manière dont PostgreSQL gère les autorisations de base de données . S'il n'y a pas de rôle pour l'utilisateur postgres, il ne peut accéder à rien. La commande createuser est un wrapper fin autour des commandes CREATE USER, CREATE ROLE, etc.

Chris Sherlock
la source
8
J'ai dû utiliser sudo su - postgresavant que cette commande ne fonctionne pour moi. Merci!
Connor Leech
2
Je ne sais pas comment ma configuration est née mais j'ai fait créer postgresql sans utilisateur et rôle postgres, myUser comme seul utilisateur, mais j'ai refusé de me laisser entrer sous prétexte que la base de données nommée myUser était inexistante! cette partie démêlée du chaos!
Jerome
@StuartNelson: Cela semble être la solution à un problème commun ( même ici ). Mais ce n'est évidemment pas la réponse à cette question. Le PO indique clairement que le rôle existait dans son DB.
Erwin Brandstetter
Sauf que vous confondez les rôles avec les utilisateurs. L'utilisateur existait, le rôle n'existait pas - il dit clairement que l' utilisateur existe, pas le rôle.
Chris Sherlock
L' -roption n'est pas nécessaire avec l' -soption. Le superutilisateur inclut l'attribut "Créer un rôle".
Dennis
26

Récemment, j'ai eu ce problème immédiatement après l'installation de postgres. S'il survient immédiatement après l'installation, il se peut que l'utilisateur par défaut, postgres. Dans ce cas, vous pouvez créer des postgres utilisateur par défaut en utilisant la commande ci-dessous.

createuser -s -U $ USER

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

Il vous demandera d'entrer le nom et le mot de passe du rôle de base de données requis.Une fois le processus terminé, vous pouvez vous connecter à la console postgres en utilisant la commande ci-dessous

psql -U 'your_database_name'

Ex: psql -U postgres
Ici, vous devez entrer le mot de passe si vous en avez donné, lors de la création de l'utilisateur.

J'espère que ça aide :)

Prem
la source
22

J'étais sous OSX 10.8 et tout ce que j'essayais me donnait le FATAL: role "USER" does not exist. Comme beaucoup de gens l'ont dit ici, courez createuser -s USER, mais cela m'a donné la même erreur. Cela a finalement fonctionné pour moi:

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

Le createuser -s --username=postgrescrée un superutilisateur (indicateur -s) en se connectant en tant que postgres (--username = indicateur postgres).

Je vois que votre question a été répondue, mais je veux ajouter cette réponse pour les personnes utilisant OSX essayant d'installer PostgreSQL 9.2.4.

Jack
la source
2
Vous pouvez raccourcir les deux premières lignes en sudo su postgres.
6 pieds Dan
C'était aussi la solution pour moi sur ubuntu, n'oubliez pas de mettre à jour votre database.yml pour utiliser le même nom d'utilisateur que ci
crobicha
10

J'ai rencontré ce problème dès la première installation de la chose POSTGRES.app de Heroku. Après un essai et une erreur du matin, je pense que cette ligne de code a résolu le problème. Comme décrit précédemment, c'est parce que postgresql n'a pas de rôle par défaut la première fois qu'il est configuré. Et nous devons définir cela.

sovanlandy=# CREATE ROLE postgres LOGIN;

Vous devez vous connecter à votre console psql respective pour utiliser cette commande psql.

Notez également que si vous avez déjà créé le rôle 'postgre' mais que vous obtenez toujours des erreurs d'autorisation, vous devez modifier avec la commande:

sovanlandy=# ALTER ROLE postgres LOGIN;

J'espère que ça aide!

Sovanlandy
la source
4

Dans la documentation Heroku; Pour commencer avec les rails 4, ils disent:

Vous devrez également supprimer le champ nom d'utilisateur dans votre database.yml s'il y en a un: Dans le fichier config / database.yml remove: username: myapp

Ensuite, vous supprimez simplement cette ligne dans "development:", si vous ne le faites pas, pg indique à la base de données qui fonctionne sous le rôle "myapp"

Cette ligne indique aux rails que la base de données myapp_development doit être exécutée sous un rôle de myapp. Puisque vous n'avez probablement pas ce rôle dans votre base de données, nous le supprimerons. Avec la ligne remove Rails essaiera d'accéder à la base de données en tant qu'utilisateur actuellement connecté à l'ordinateur.

Pensez également à créer la base de données pour le développement:

$createdb myapp_development

Remplacez "myapp" par le nom de votre application

Yunrock
la source
2

Pourriez-vous avoir plusieurs bases de données locales? Vérifiez votre database.ymlet assurez-vous que vous atteignez la base de données pg que vous voulez. Utilisez rails consolepour confirmer.

Jonathan Julian
la source
2

La procédure d'installation crée un compte utilisateur appelé postgresqui est associé au rôle Postgres par défaut. Pour utiliser Postgres, vous pouvez vous connecter à ce compte. Mais si elle n'est pas explicitement spécifiée, l'application rails recherche un rôle différent, plus particulièrement le rôle ayant votre nom d'utilisateur unix qui pourrait ne pas être créé dans les rôles postgres.

Pour surmonter cela, vous pouvez créer un nouveau rôle, d'abord en basculant vers le rôle par défaut postgres qui a été créé lors de l'installation

sudo -i -u postgres

Une fois que vous êtes connecté au compte postgres, vous pouvez créer un nouvel utilisateur par la commande:

createuser --interactive

Cela vous proposera quelques choix et, en fonction de vos réponses, exécutera les commandes Postgres correctes pour créer un utilisateur.

Passez un nom de rôle et certaines autorisations et le rôle est créé, vous pouvez ensuite migrer votre base de données

Mayur
la source
1

Ma réponse était beaucoup plus simple. Je suis juste allé dans le dossier db et j'ai supprimé la colonne id, que j'avais essayé de créer avec force, mais qui est en fait créée automatiquement. J'ai également supprimé le nom d'utilisateur dans le fichier database.yml (sous le dossier config).

maudulus
la source
1

Dans l'invite de commande de l'utilisateur local Ubuntu, mais pas dans l'utilisateur root, tapez

sudo -u postgres createuser nom d'utilisateur

Le nom d'utilisateur ci-dessus doit correspondre au nom indiqué dans le message "FATAL: le rôle 'nom d'utilisateur' n'existe pas."

Entrez le mot de passe pour le nom d'utilisateur.

Entrez ensuite à nouveau la commande que le rôle généré n'existe pas.

Robert Cambil
la source
0

Je me suis retrouvé ici après avoir tenté de suivre le tutoriel de Ryan Bate sur le déploiement sur AWS EC2 avec du caoutchouc. Voici ce qui m'est arrivé: nous avons créé une nouvelle application en utilisant "

rails new blog -d postgresql

Évidemment, cela crée une nouvelle application avec pg comme base de données, mais la base de données n'a pas encore été créée. Avec sqlite, vous exécutez simplement rake db: migrate, mais avec pg, vous devez d'abord créer la base de données pg. Ryan n'a pas fait cette étape. La commande est rake db:create:all, alors nous pouvons exécuterrake db:migrate

La deuxième partie consiste à modifier le fichier database.yml. La valeur par défaut du nom d'utilisateur lorsque le fichier est généré est «appname». Cependant, il y a de fortes chances que votre rôle d'administrateur postgresql soit quelque chose de différent (du moins c'était pour moi). Je l'ai changé en mon nom (voir les conseils ci-dessus sur la création d'un nom de rôle) et j'étais prêt à partir.

J'espère que cela t'aides.

Andrew Shenstone
la source
0

Après un tas d'installation et de désinstallation de Postgres, voici ce qui semble maintenant fonctionner de manière cohérente pour moi avec Os X Mavericks, Rails 4 et Ruby 2.

  1. Dans le fichier database.yml, je change les noms d'utilisateur par défaut en nom d'utilisateur de mon ordinateur qui pour moi est simplement "admin".

  2. Dans la ligne de commande, je lance rake db: create: all

  3. Ensuite, je lance rake db: migrate

  4. Lorsque je lance le serveur de rails et que je vérifie l'hôte local, il dit "Bienvenue à bord".

Michael van Holst
la source
0

Vous pourrez peut-être contourner ce problème en l'exécutant initdb -U postgres -D /path/to/dataou en l'exécutant en tant que postgres de l'utilisateur, car il est défini par défaut sur l'utilisateur actuel. GL!

rogerdpack
la source