59 votes

Le rôle n'existe pas et il est impossible de créer une base de données lorsque l'on utilise PostgreSQL

J'utilise Heroku pour mon application et elle nécessite PostgreSQL mais vous pouvez toujours utiliser SQLite3 pour le développement. Comme Heroku déconseille fortement d'avoir 2 bases de données différentes, j'ai décidé de passer à PostgreSQL pour le développement. J'ai installé le gem pg et je me suis également rendu sur le site officiel de PostgreSQL pour obtenir le programme d'installation pour Windows et j'ai également changé mon nom de domaine. database.yml . Lors de l'installation, il est demandé un mot de passe pour PostgreSQL, j'en ai donc créé un. J'ai dû changer le pg_hba.conf de l'utilisation de md5 à trust pour pouvoir passer : fe_sendauth: no password supplied lors de la tentative de création de la base de données.

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
host    all             all             127.0.0.1/32            trust # was md5
# IPv6 local connections:
host    all             all             ::1/128                 trust # was md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
#host    replication     postgres        127.0.0.1/32            trust
#host    replication     postgres        ::1/128                 trust

Après m'être débarrassé de cela, j'ai maintenant ceci :

$ rake db:create
(in C:/app)
FATAL:  role "User" does not exist 
Couldn't create database for {"adapter"=>"postgresql", "encoding"=>"utf8", 
"database"=>"app_test", "pool"=>5, "username"=>nil, "password"=>nil} 

J'ai toujours mon development.sqlite3 et text.sqlite3 présent, est-ce que cela pourrait être le problème ? Que faut-il faire ?

Voici l'essentiel de mes propos : https://gist.github.com/1522188

131voto

mu is too short Points 205090

Ajoutez un nom d'utilisateur à votre database.yml Pour le nom d'utilisateur, il est préférable d'utiliser le nom de votre application (ou une variante du nom). app_name en tant que substitut :

development:
  adapter: postgresql
  encoding: utf8
  database: app_development
  pool: 5
  username: app_name
  password:

Ensuite, créez l'utilisateur (alias "rôle") à l'intérieur de PostgreSQL en utilisant psql.exe :

$ psql -d postgres
postgres=# create role app_name login createdb;
postgres=# \q

La première ligne est dans votre terminal, les deux suivantes sont à l'intérieur de psql . Ensuite, faites votre rake db:create .

Le site User est éventuellement un défaut mais user est déjà pris à d'autres fins dans PostgreSQL, il faudrait donc le citer pour préserver l'affaire si vous vouliez utiliser User comme nom d'utilisateur :

postgres=# create role "User" login createdb;

Il est préférable de créer un utilisateur par application de toute façon.

Vous voudrez faire la même chose pour votre test entrée dans database.yml également.

8voto

Dennis Points 5020

PostgreSQL essaiera de créer la base de données avec votre nom de compte (login) si un username n'est pas spécifié dans votre config/database.yml . Sous OS X et Linux vous pouvez voir qui c'est avec whoami . On dirait que vous utilisez Windows.

Solution A : Créer un utilisateur PostgreSQL qui correspond à celle qu'il recherche. Par exemple

createuser --superuser some_user

Solution B : Changer l'utilisateur de la BD en définissant explicitement un nom d'utilisateur comme indiqué dans la réponse de mu .

7voto

Ishan Kanade Points 167

Si vous avez un compte/utilisateur spécifique sur votre machine pour postgres appelé postgres par exemple.

Ensuite, l'exécution de cette commande fera apparaître une invite vous permettant de saisir un nom de rôle.

sudo -u postgres createuser --interactive

Ensuite, en faisant

rake db:create

Cela devrait marcher !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X