Rails und PostgreSQL: Rolle postgres existiert nicht

106

Ich habe PostgreSQL auf meinem Mac OS Lion installiert und arbeite an einer Rails-App. Ich verwende RVM, um alles von meinen anderen Rails-Apps zu trennen.

Aus irgendeinem Grund kann Rake den Postgres-Benutzer nicht finden, wenn ich versuche, die Datenbank zum ersten Mal zu migrieren. Ich bekomme den Fehler

 FATAL:  role "postgres" does not exist

Ich habe pgAdmin, damit ich deutlich sehen kann, dass sich ein Postgres-Benutzer in der Datenbank befindet - das Administratorkonto in der Tat -, daher bin ich mir nicht sicher, was ich sonst tun soll.

Ich habe irgendwo über Leute gelesen, die Probleme mit PostgreSQL haben, aufgrund dessen der Pfad installiert wurde, aber dann glaube ich nicht, dass ich so weit gekommen wäre, wenn es die Datenbank nicht gefunden hätte.

Adam
quelle
Für das eng verwandte Problem, bei dem der DB-Benutzer (= Rolle) postgresnicht erstellt wurde, was zu derselben Fehlermeldung führen kann, siehe diese verwandte Frage: stackoverflow.com/questions/11919391/…
Erwin Brandstetter

Antworten:

12

Diese Meldung wird angezeigt, wenn der Datenbankbenutzer nicht vorhanden ist. Vergleichen Sie das Handbuch hier .
Mehrere lokale Datenbanken können nicht die Erklärung sein. Rollen sind clusterweit gültig. Das Handbuch noch einmal :

Beachten Sie, dass Rollen auf Datenbankclusterebene definiert sind und daher in allen Datenbanken im Cluster gültig sind.

Sie müssen in einem anderen Datenbankcluster landen . Das wäre ein anderer Server, der auf demselben Computer läuft und einen anderen Port abhört. Oder eher auf einer anderen Maschine.

Könnte es sein, dass die Nachricht tatsächlich vom Remote-Server stammt?

Erwin Brandstetter
quelle
Das war es - ich hatte Schwierigkeiten, postgresql zur Arbeitszeit zu bringen, also habe ich eine Neuinstallation durchgeführt, also muss ich jetzt ein paar Instanzen hier haben. Der Port in der Datei database.yml wurde jedoch geändert, und alles hat einwandfrei funktioniert. Danke für Ihre Hilfe!
Adam
hat auch nach dem Aufräumen aller Bilder nicht funktioniert - docker rmi $(docker images -q) --force. aber Problem war volumesich denke
prayagupd
266

Aus einem unbekannten Grund stellte ich fest, dass das Problem tatsächlich darin bestand, dass die postgresql-Rolle nicht erstellt wurde.

Versuchen Sie zu laufen:

createuser -s -r postgres

Beachten Sie, dass PostgreSQL in Rollen Datenbankberechtigungen verwaltet . Wenn für den Postgres-Benutzer keine Rolle vorhanden ist, kann er auf nichts zugreifen. Der Befehl createuser ist ein dünner Wrapper um die Befehle CREATE USER, CREATE ROLE usw.

Chris Sherlock
quelle
8
Ich musste verwenden, sudo su - postgresbevor dieser Befehl für mich funktionierte. Vielen Dank!
Connor Leech
2
Ich weiß nicht, wie meine Einrichtung zustande kam, aber ich hatte postgresql ohne postgres-Benutzer und -Rolle erstellt, myUser als einziger Benutzer, aber ich wollte mich nicht unter dem Vorwand einlassen, dass die Datenbank mit dem Namen myUser nicht vorhanden war! dieser enträtselte Teil des Chaos!
Jerome
@StuartNelson: Dies scheint die Lösung für ein häufiges Problem zu sein (das gleiche hier ). Aber es ist offensichtlich nicht die Antwort auf diese Frage. Das OP stellt klar fest, dass die Rolle in seiner DB bestand.
Erwin Brandstetter
Außer dass Sie Rollen mit Benutzern zusammenführen. Der Benutzer existierte, die Rolle nicht - er sagt klar, dass der Benutzer existiert, nicht die Rolle.
Chris Sherlock
Die -rOption ist bei der -sOption nicht erforderlich . Superuser enthält das Attribut "Rolle erstellen".
Dennis
26

Vor kurzem habe ich dieses Problem sofort nach der Installation von Postgres bekommen. Wenn es unmittelbar nach der Installation kommt, fehlt möglicherweise der Standardbenutzer postgres. In diesem Fall können Sie mit dem folgenden Befehl Standard-Benutzer-Postgres erstellen.

createuser -s -U $ USER

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

Sie werden aufgefordert, den erforderlichen Namen und das Kennwort für die Datenbankrolle einzugeben. Nach Abschluss des Vorgangs können Sie sich mit dem folgenden Befehl bei der postgres-Konsole anmelden

psql -U 'your_database_name'

Beispiel: psql -U postgres
Hier müssen Sie beim Erstellen des Benutzers das Kennwort eingeben, falls Sie eines angegeben haben.

Ich hoffe es hilft :)

Prem
quelle
22

Ich war unter OSX 10.8 und alles, was ich versuchte, würde mir das geben FATAL: role "USER" does not exist. Wie viele Leute hier sagten, renn createuser -s USER, aber das gab mir den gleichen Fehler. Das hat bei mir endlich geklappt:

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

Das createuser -s --username=postgreserstellt einen Superuser (-s Flag) durch Verbinden als Postgres (--username = Postgres Flag).

Ich sehe, dass Ihre Frage beantwortet wurde, aber ich möchte diese Antwort für Benutzer von OSX hinzufügen, die versuchen, PostgreSQL 9.2.4 zu installieren.

Jack
quelle
2
Sie können die ersten beiden Zeilen auf kürzen sudo su postgres.
6ft Dan
Dies war auch die Lösung für mich auf Ubuntu, vergessen Sie nicht, Ihre database.yml zu aktualisieren, um den gleichen Benutzernamen wie oben zu verwenden
crobicha
10

Ich habe dieses Problem gleich bei der ersten Installation der POSTGRES.app-Sache von Heroku festgestellt. Nach einem morgendlichen Versuch und Irrtum denke ich, dass diese eine Codezeile das Problem gelöst hat. Wie bereits beschrieben, liegt dies daran, dass postgresql beim ersten Einrichten keine Standardrolle hat. Und das müssen wir einstellen.

sovanlandy=# CREATE ROLE postgres LOGIN;

Sie müssen sich bei Ihrer jeweiligen psql-Konsole anmelden, um diesen psql-Befehl verwenden zu können.

Beachten Sie auch, dass Sie Folgendes ändern müssen, wenn Sie die Rolle 'postgre' bereits erstellt haben, aber dennoch Berechtigungsfehler erhalten:

sovanlandy=# ALTER ROLE postgres LOGIN;

Ich hoffe es hilft!

sovanlandy
quelle
4

In der Heroku-Dokumentation; Erste Schritte mit Schienen 4, sagen sie:

Sie müssen auch das Feld Benutzername in Ihrer database.yml entfernen, wenn es eines gibt: In der Datei config / database.yml entfernen Sie: Benutzername: myapp

Dann löschen Sie einfach diese Zeile in "Entwicklung:", wenn Sie nicht pg sagt zu der Datenbank, die unter der Rolle "myapp" arbeitet.

Diese Zeile teilt Rails mit, dass die Datenbank myapp_development unter der Rolle myapp ausgeführt werden soll. Da Sie diese Rolle wahrscheinlich nicht in Ihrer Datenbank haben, werden wir sie entfernen. Mit der Zeile entfernen versucht Rails, als Benutzer, der derzeit am Computer angemeldet ist, auf die Datenbank zuzugreifen.

Denken Sie auch daran, die Datenbank für die Entwicklung zu erstellen:

$createdb myapp_development

Ersetzen Sie "myapp" durch Ihren App-Namen

Yunrock
quelle
2

Könnten Sie mehrere lokale Datenbanken haben? Überprüfen Sie Ihre database.ymlund stellen Sie sicher, dass Sie die gewünschte pg db treffen. Verwenden Sie rails consolezur Bestätigung.

Jonathan Julian
quelle
2

Bei der Installation wird ein Benutzerkonto postgresmit dem Namen erstellt , das der Standardrolle von Postgres zugeordnet ist. Um Postgres verwenden zu können, können Sie sich bei diesem Konto anmelden. Wenn dies nicht explizit angegeben wird, sucht die Rails-App nach einer anderen Rolle, insbesondere nach der Rolle mit Ihrem Unix-Benutzernamen, die möglicherweise nicht in den Postgres-Rollen erstellt wurde.

Um dies zu überwinden, können Sie eine neue Rolle erstellen, indem Sie zunächst auf die Standardrolle postgres umschalten, die während der Installation erstellt wurde

sudo -i -u postgres

Nachdem Sie beim postgres-Konto angemeldet sind, können Sie mit dem folgenden Befehl einen neuen Benutzer erstellen:

createuser --interactive

Dies fordert Sie zur Auswahl auf und führt basierend auf Ihren Antworten die richtigen Postgres-Befehle aus, um einen Benutzer zu erstellen.

Wenn Sie einen Rollennamen und einige Berechtigungen übergeben und die Rolle erstellt wird, können Sie Ihre Datenbank migrieren

Mayur
quelle
1

Meine Antwort war viel einfacher. Ging einfach in den Ordner db und löschte die ID-Spalte, die ich versucht hatte, zwangsweise zu erstellen, die aber tatsächlich automatisch erstellt wird. Ich habe auch den USERNAME in der Datei database.yml (unter dem Konfigurationsordner) gelöscht.

Maudulus
quelle
1

Geben Sie in die Eingabeaufforderung des lokalen Benutzers von Ubuntu, jedoch nicht des Root-Benutzers, ein

sudo -u postgres createuser Benutzername

Der obige Benutzername sollte mit dem Namen übereinstimmen, der in der Meldung "FATAL: Rolle 'Benutzername' existiert nicht."

Geben Sie das Passwort für den Benutzernamen ein.

Geben Sie dann den Befehl erneut ein, dass die generierte Rolle nicht vorhanden ist.

Robert Cambil
quelle
0

Ich bin hier gelandet, nachdem ich versucht hatte, Ryan Bates Tutorial zur Bereitstellung auf AWS EC2 mit Gummi zu folgen. Folgendes ist für mich passiert: Wir haben eine neue App mit "

rails new blog -d postgresql

Offensichtlich wird dadurch eine neue App mit pg als Datenbank erstellt, aber die Datenbank wurde noch nicht erstellt. Mit sqlite führen Sie einfach rake db: migrate aus. Mit pg müssen Sie jedoch zuerst die pg-Datenbank erstellen. Ryan hat diesen Schritt nicht gemacht. Der Befehl lautet rake db:create:all, dann können wir ausführenrake db:migrate

Der zweite Teil ändert die Datei database.yml. Der Standardwert für den Benutzernamen beim Generieren der Datei ist "Anwendungsname". Es besteht jedoch die Möglichkeit, dass Ihre Rolle für den Postgresql-Administrator etwas anderes ist (zumindest für mich). Ich habe es in meinen Namen geändert (siehe obige Ratschläge zum Erstellen eines Rollennamens) und es war gut zu gehen.

Hoffe das hilft.

Andrew Shenstone
quelle
0

Nach einer Reihe von Installationen und Deinstallationen von Postgres scheint Folgendes nun für mich mit Os X Mavericks, Rails 4 und Ruby 2 konsistent zu funktionieren.

  1. In der Datei database.yml ändere ich die Standardbenutzernamen in den Benutzernamen meines Computers, der für mich nur "admin" ist.

  2. In der Kommandozeile starte ich rake db: create: all

  3. Dann starte ich rake db: migrate

  4. Wenn ich den Rails-Server betreibe und den lokalen Host überprüfe, wird "Willkommen an Bord" angezeigt.

Michael van Holst
quelle
0

Möglicherweise können Sie dies initdb -U postgres -D /path/to/dataumgehen, indem Sie es als Benutzer postgres ausführen oder ausführen, da standardmäßig der aktuelle Benutzer verwendet wird. GL!

Rogerdpack
quelle