Rails e PostgreSQL: A função postgres não existe

106

Eu instalei o PostgreSQL no meu Mac OS Lion e estou trabalhando em um aplicativo Rails. Eu uso o RVM para manter tudo separado dos meus outros aplicativos Rails.

Por alguma razão, quando tento migrar o banco de dados pela primeira vez, o rake não consegue encontrar o usuário postgres. Eu entendi o erro

 FATAL:  role "postgres" does not exist

Eu tenho o pgAdmin, então posso ver claramente que há um usuário postgres no banco de dados - a conta de administrador na verdade - então não tenho certeza do que mais fazer.

Eu li em algum lugar sobre pessoas que estão tendo problemas com o PostgreSQL por causa do caminho em que ele foi instalado, mas acho que não teria chegado tão longe se não conseguisse encontrar o banco de dados.

Adão
fonte
Para o problema intimamente relacionado em que o usuário do banco de dados (= função) postgresnão foi criado, o que pode levar à mesma mensagem de erro, consulte esta questão relacionada: stackoverflow.com/questions/11919391/…
Erwin Brandstetter

Respostas:

12

Esta mensagem aparece quando o usuário do banco de dados não existe. Compare o manual aqui .
Vários bancos de dados locais não podem ser a explicação. As funções são válidas em todo o cluster. O manual novamente :

Observe que as funções são definidas no nível do cluster de banco de dados e, portanto, são válidas em todos os bancos de dados do cluster.

Você deve terminar em outro cluster de banco de dados . Isso seria outro servidor em execução na mesma máquina, ouvindo em uma porta diferente. Ou, mais provavelmente, em uma máquina diferente.

Será que a mensagem vem, de fato, do servidor remoto?

Erwin Brandstetter
fonte
É isso - tenho tido dificuldade em fazer o postgresql funcionar, então fiz uma nova instalação, então devo ter algumas instâncias aqui agora. Mudou a porta no arquivo database.yml embora e tudo funcionou bem. Obrigado pela ajuda!
Adam
não funcionou mesmo depois de limpar todas as imagens - docker rmi $(docker images -q) --force. mas o problema estava acontecendo, volumeseu acho
prayagupd
267

Na verdade, por algum motivo desconhecido, descobri que o problema era porque a função postgresql não havia sido criada.

Tente executar:

createuser -s -r postgres

Observe que as funções são a forma como o PostgreSQL mantém as permissões do banco de dados . Se não houver função para o usuário postgres, ele não poderá acessar nada. O comando createuser é um wrapper fino em torno dos comandos CREATE USER, CREATE ROLE, etc.

Chris Sherlock
fonte
8
Eu tive que usar sudo su - postgresantes que esse comando funcionasse para mim. Obrigado!
Connor Leech
2
Não sei como minha configuração surgiu, mas eu tinha postgresql criado sem usuário e função postgres, myUser como único usuário, mas me recusei a me deixar entrar sob o pretexto de que o banco de dados chamado myUser era inexistente! esta parte desvendada do caos!
Jerome
@StuartNelson: Esta parece ser a solução para um problema comum (o mesmo aqui ). Mas obviamente não é a resposta a esta pergunta. O OP afirma claramente que a função existia em seu DB.
Erwin Brandstetter
Exceto que você está combinando funções com usuários. O usuário existia, a função não - ele diz claramente que o usuário existe, não a função.
Chris Sherlock
A -ropção não é necessária com a -sopção. O superusuário inclui o atributo "Criar função".
Dennis,
26

Recentemente, tive esse problema imediatamente após instalar o postgres. Se vier imediatamente após a instalação, você pode não ter o usuário padrão, postgres. Nesse caso, você pode criar postgres de usuário padrão usando o comando abaixo.

createuser -s -U $ USER

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

Ele solicitará que você insira o nome e a senha da função de banco de dados necessária. Depois de concluir o processo, você pode fazer o login no console do postgres usando o comando abaixo

psql -U 'your_database_name'

Ex: psql -U postgres
Aqui, é necessário inserir a senha, se houver, ao criar o usuário.

Espero que ajude :)

Prem
fonte
22

Eu estava no OSX 10.8 e tudo o que tentei me deu o FATAL: role "USER" does not exist. Como muita gente falou aqui, corre createuser -s USER, mas deu o mesmo erro. Isso finalmente funcionou para mim:

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

O createuser -s --username=postgrescria um superusuário (sinalizador -s) conectando-se como postgres (--username = sinalizador postgres).

Vejo que sua pergunta foi respondida, mas quero adicionar esta resposta para pessoas que usam OSX tentando instalar o PostgreSQL 9.2.4.

Jack
fonte
2
Você pode encurtar as duas primeiras linhas para sudo su postgres.
6 pés de Dan
Esta também foi a solução para mim no ubuntu, não se esqueça de atualizar seu database.yml para usar o mesmo nome de usuário acima
crobicha
10

Eu encontrei esse problema logo que instalei pela primeira vez o POSTGRES.app do Heroku. Após uma tentativa e erro matinais, acho que essa linha de código resolveu o problema. Conforme descrito anteriormente, isso ocorre porque o postgresql não tem uma função padrão na primeira vez que é configurado. E precisamos definir isso.

sovanlandy=# CREATE ROLE postgres LOGIN;

Você deve fazer login no respectivo console psql para usar este comando psql.

Observe também que, se você já criou a função 'postgre', mas ainda obtém erros de permissão, é necessário alterar com o comando:

sovanlandy=# ALTER ROLE postgres LOGIN;

Espero que ajude!

soberania
fonte
4

Na documentação do Heroku; Começando com os trilhos 4, eles dizem:

Você também precisará remover o campo de nome de usuário em seu database.yml se houver um: No arquivo config / database.yml remova: username: myapp

Então você apenas deleta aquela linha em "development:", se você não pg informa ao banco de dados que funciona sob a função "myapp"

Esta linha diz ao Rails que o banco de dados myapp_development deve ser executado sob uma função de myapp. Como você provavelmente não tem essa função em seu banco de dados, nós a removeremos. Com a linha remove, o Rails tentará acessar o banco de dados como um usuário que está atualmente logado no computador.

Lembre-se também de criar o banco de dados para desenvolvimento:

$createdb myapp_development

Substitua "myapp" pelo nome do seu aplicativo

Yunrock
fonte
2

Você poderia ter vários bancos de dados locais? Verifique seu database.ymle certifique-se de que está atingindo o pg db desejado. Use rails consolepara confirmar.

Jonathan Julian
fonte
2

O procedimento de instalação cria uma conta de usuário chamada postgresque está associada à função Postgres padrão. Para usar o Postgres, você pode entrar nessa conta. Mas se não for especificado explicitamente, o aplicativo rails procura uma função diferente, mais particularmente a função com seu nome de usuário unix que pode não ter sido criado nas funções do postgres.

Para superar isso, você pode criar uma nova função, primeiro alternando para a função padrão postgres que foi criada durante a instalação

sudo -i -u postgres

Depois de fazer login na conta do postgres, você pode criar um novo usuário pelo comando:

createuser --interactive

Isso solicitará algumas opções e, com base em suas respostas, executará os comandos corretos do Postgres para criar um usuário.

Passe um nome de função e algumas permissões e a função é criada, você pode então migrar seu banco de dados

Mayur
fonte
1

Minha resposta foi muito mais simples. Apenas fui para a pasta db e excluí a coluna id, que tentei criar à força, mas que na verdade é criada de forma automática. Eu também apaguei o USERNAME no arquivo database.yml (na pasta config).

maudulus
fonte
1

No prompt de comando do usuário local do Ubuntu, mas não no usuário root, digite

sudo -u postgres createuser nome de usuário

O nome de usuário acima deve corresponder ao nome indicado na mensagem "FATAL: função 'nome de usuário' não existe."

Digite a senha para o nome de usuário.

Em seguida, digite novamente o comando que gerou a mensagem função não existe.

Robert Cambil
fonte
0

Acabei aqui depois de tentar seguir o tutorial de Ryan Bate sobre como implantar no AWS EC2 com borracha. Aqui está o que aconteceu para mim: criamos um novo aplicativo usando "

rails new blog -d postgresql

Obviamente, isso cria um novo aplicativo com pg como banco de dados, mas o banco de dados ainda não foi feito. Com o sqlite, você apenas executa rake db: migrate, porém com o pg você precisa criar o banco de dados pg primeiro. Ryan não fez esta etapa. O comando é rake db:create:all, então podemos executarrake db:migrate

A segunda parte é alterar o arquivo database.yml. O padrão para o nome de usuário quando o arquivo é gerado é 'appname'. No entanto, é provável que sua função como administrador do postgresql seja diferente (pelo menos era para mim). Mudei para o meu nome (veja os conselhos acima sobre como criar um nome de função) e estava pronto para prosseguir.

Espero que isto ajude.

Andrew Shenstone
fonte
0

Depois de um monte de instalação e desinstalação do Postgres, aqui está o que agora parece funcionar de forma consistente para mim com Os X Mavericks, Rails 4 e Ruby 2.

  1. No arquivo database.yml, eu mudo os nomes de usuário padrão para o nome de usuário do meu computador, que para mim é apenas "admin".

  2. Na linha de comando, executo rake db: create: all

  3. Então eu executo rake db: migrate

  4. Quando eu executo o servidor Rails e verifico o host local, ele diz "Bem-vindo a bordo".

Michael van Holst
fonte
0

Você pode ser capaz de contornar isso executando-o initdb -U postgres -D /path/to/dataou executando-o como usuário postgres, uma vez que o padrão é o usuário atual. GL!

rogerdpack
fonte