Usuários de relação de erro indefinido PG não existe

92

Eu vi essa pergunta antes, mas apenas para rspec. Ainda não criei o teste porque é muito avançado para mim, mas um dia farei! : P

Recebo este erro quando tento me inscrever / fazer login em meu aplicativo. Usei o devise para criar o usuário e também o omniauth2 para fazer login no google .

este é o erro

ActiveRecord::StatementInvalid at /users/auth/google_oauth2/callback
PG::UndefinedTable: ERROR:  relation "users" does not exist
LINE 5:              WHERE a.attrelid = '"users"'::regclass
                                        ^
:             SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                     pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
              FROM pg_attribute a LEFT JOIN pg_attrdef d
                ON a.attrelid = d.adrelid AND a.attnum = d.adnum
             WHERE a.attrelid = '"users"'::regclass
               AND a.attnum > 0 AND NOT a.attisdropped
             ORDER BY a.attnum

Já tentei rake db:migrate, mas já está criado: na tabela de esquema existem usuários. Alguém já teve esse erro antes?

database.yml

config = / opt / local / lib / postgresql84 / bin / pg_config

development:
  adapter: postgresql
  encoding: unicode
  database: tt_intraweb_development
  pool: 5
  username: my_username
  password:

test:
  adapter: postgresql
  encoding: unicode
  database: tt_intraweb_test
  pool: 5
  username: my_username
  password:

production:
  adapter: postgresql
  encoding: unicode
  database: tt_intraweb_production
  pool: 5
  username: my_username
  password:
Naomi K
fonte
Alguma resposta foi útil?
Малъ Скрылевъ
Não para mim, ter o mesmo erro e nenhuma das respostas me ajudou.
Gustavo Semião-Lobo
@GustavoLobo, você tem uma migração adequada configurada?
Малъ Скрылевъ
8
Na verdade, eu estava errado, desculpe por isso. RAILS_ENV=test rake db:migratetrabalhou para mim.
Gustavo Semião-Lobo

Respostas:

118

Em primeiro lugar, você deve desanexar todas as conexões do banco de dados. Por padrão, você usa o ambiente de desenvolvimento . Em seguida, tente redefinir o banco de dados com o seguinte:

rake db:reset

A tarefa rake db: reset irá remover o banco de dados e configurá-lo novamente. Isso é funcionalmente equivalente a rake db: drop db: setup.

Isso não é o mesmo que executar todas as migrações. Ele usará apenas o conteúdo do arquivo schema.rb atual. Se uma migração não puder ser revertida, rake db: reset pode não ajudá-lo. Para saber mais sobre como descartar o esquema, consulte a seção Esquema Dumping e você. Rails Docs

Se o truque não ajudar, elimine o banco de dados, recrie-o novamente, migre os dados e, se você tiver sementes, semeie o banco de dados:

rake db:drop db:create db:migrate db:seed

ou resumidamente (desde 3.2):

rake db:migrate:reset db:seed

Uma vez que db:migrate:resetimplica em descartar, crie e migre o banco de dados. Porque o ambiente padrão para rakeé o desenvolvimento , caso você veja a exceção nos testes de especificação, você deve recriar o banco de dados para o ambiente de teste da seguinte maneira:

RAILS_ENV=test rake db:drop db:create db:migrate

ou apenas carregando o esquema migrado:

RAILS_ENV=test rake db:drop db:create db:schema:load

Na maioria dos casos, o banco de dados de teste está sendo semeado durante os procedimentos de teste, portanto db:seed, a ação da tarefa não precisa ser aprovada. Caso contrário, você deve preparar o banco de dados (isto está obsoleto no Rails 4 ):

rake db:test:prepare

e então (se for realmente necessário):

RAILS_ENV=test rake db:seed

Em versões mais recentes do Rails, o erro ActiveRecord :: NoEnvironmentInSchemaError pode ser aumentado, portanto, apenas acrescente as tarefas com um ambiente de banco de dados definido tarefa: db: ambiente: conjunto :

RAILS_ENV=test rake db:environment:set db:drop db:create db:migrate
Малъ Скрылевъ
fonte
para mim - RAILS_ENV = test rake db: drop db: create db: schema: load funciona, obrigado pela resposta. Ótimo
AMIC MING
rake db:test:preparefaz o trabalho.
Francisco Quintero
Obrigado senhor acabou de salvar minha vida. Eu tento descartar, criar, migrar, configurar, mas nenhum desses comandos funciona até eu tentar seu comando rake db:reset. A mágica acontece cara!
Travis Le
18

Eu encontrei este erro, e em minha pesquisa, descobri que uma das razões para usuários de relação de erro indefinível do PG não existe é:

Este é um erro de migração. Você pode ter criado um novo modelo com alguns atributos de banco de dados. Depois de criar o modelo, você deve migrar os atributos para o esquema do aplicativo Rails.

Se você estiver usando uma máquina local, para desenvolvimento, você pode usar o comando

rake db:migrate

Se você estiver usando heroku

heroku run rake db:migrate
supritshah1289
fonte
3
Excelente! Para rails 5 você deve usar 'heroku run rails db: migrate'
Raphael Onofre
1
Isso funcionou para mim. Eu precisava correr rake db:migrate. Obrigado.
Promise Preston
14

Seu banco de dados de teste não está pronto para rspec.

Prepare seu banco de dados de teste para rspec para corrigir este erro

RAILS_ENV=test rake test:prepare

Ele descartará, criará e adicionará migrações ao seu banco de dados de teste

Caso a tarefa rake seja abortada com uma mensagem como 'PG :: Error: ERROR: database "[your_db_test]" está sendo acessado por outros usuários execute este

RAILS_ENV=test rake db:migrate
Serge Seletskyy
fonte
12

Eu tive um erro semelhante. A raiz do meu erro foi que eu tinha uma referência a um modelo Rails em meu arquivo factories.rb. Portanto, isso causou um problema de erro de carregamento. A solução era envolver a referência em um bloco ou{} atrasar sua execução.

Aqui estava o código BROKEN:

FactoryGirl.define do
  factory :user do
    guid User.new.send(:new_token)
  end
end

E estava errado porque Usernão foi definido quando o factories.rb estava sendo carregado. Enrolei a User.newchamada em um bloco e resolveu o problema:

Código fixo:

FactoryGirl.define do
  factory :user do
    guid { User.new.send(:new_token) }
  end
end

Nota: provavelmente não é uma boa prática precisar chamar seu modelo assim, mas foi uma solução para secar meu código.

ehc
fonte
Alguém pode explicar por que "provavelmente não é a melhor prática precisar ligar para o seu modelo"? Eu concordo com os benefícios do DRY ... quais são as desvantagens? Obrigado!
theUtherSide
11

Eu estava recebendo este erro também ao executar rspec:

 Failure/Error: it { expect(subject.priority_list).to eq [nil] * 9 }
 ActiveRecord::StatementInvalid:
   PG::UndefinedTable: ERROR:  relation "priorities" does not exist
   LINE 5:              WHERE a.attrelid = '"priorities"'::regclass
 ...

Foi resolvido para mim depois que corri

rake db:test:prepare
rake db:test:load
cedricdlb
fonte
11

Isso geralmente é causado por um bug no ActiveAdmin. Veja como contornar o bug:

Se você estiver usando ActiveAdmin, qualquer tabela que PG diga não existe, comente o conteúdo desse arquivo ActiveAdmin rb.

Por exemplo, neste caso PGError: ERROR: relation "users" does not exist, comente todo o conteúdo de e app/admin/users.rb, em seguida, remova o comentário depois de fazer suas migrações.

Arcolye
fonte
Só isso funcionou para mim. Você salvou minha vida mano! Obrigado
micper
5

Esse problema para mim estava sendo causado pelos trilhos Factory Girl. Eu recomendaria para aqueles que o usam renomear a pasta specs / factories para specs / temp e tentar

RAILS_ENV = your_environment bundle exec rake db: migrate --trace

Se passar, você acabou de descobrir o que estava causando isso. Uma rápida pesquisa no repositório github de gem do Factory Girl Rails me ajudou a identificar o problema.

As fábricas estavam falhando porque eu estava tentando instanciar um modelo que não existia durante a execução! Exemplo de código abaixo:

FactoryGirl.define do
  factory :billing_product, class: 'Billing::Product' do
    name            Faker::Cat.name
    product_type    'fuel'
    active          true
    payment_options [Billing::PaymentOption.new(term: 1, payment_term: 1)]
  end
end

Encapsular a matriz em um bloco (adicionando {}) fez a correção para mim. Observe que payment_options pode ter mais de uma opção de pagamento no exemplo ...

payment_options {[Billing::PaymentOption.new(term: 1, payment_term: 1)]}

Consulte a parte Atributos dinâmicos da documentação do Factory Girl Rails para obter mais informações.

Não se esqueça de renomear sua pasta de fábricas de volta!

Igi Manaloto
fonte
4

Eu estava enfrentando o mesmo problema e então descobri a seguinte solução.

Certifique-se de ter inserido todas as seguintes credenciais no arquivo database.yml e de que estejam corretas:

development:
 adapter: postgresql
 encoding: unicode
 database: my_database
 host: localhost
 port: 5432
 pool: 5
 username: postgres
 password: xyz

test:
 adapter: postgresql
 encoding: unicode
 database: my_test_database
 host: localhost
 port: 5432
 pool: 5
 username: postgres
 password: xyz 
Muhammad Zubair
fonte
3

Tive esse problema depois de excluir a tabela de usuários. as soluções estavam mudando

change_table(:users)

para

create_table(:users)
KnuturO
fonte
3

::Migration[5.0]estava faltando nas migrações. em vez de lançar um erro de sintaxe, ele lança

PG :: UndefinedTable: ERROR: funções de relação não existem

depois de perder horas, finalmente descobri que a migração está faltando ::Migration[5.0].

Migração errônea:

class CreateRoles < ActiveRecord # <---- Pay attention
  def change
    create_table :roles do |t|
      t.string :name
      t.integer :code, limit: 2
      t.boolean :is_active, default: true

      t.timestamps
    end
  end
end

Migração Fixa e Correta

class CreateRoles < ActiveRecord::Migration[5.0]
  def change
    create_table :roles do |t|
      t.string :name
      t.integer :code, limit: 2
      t.boolean :is_active, default: true

      t.timestamps
    end
  end
end

Isso pode ser um bug com trilhos e pode ajudar alguém, ao invés de lutar e se perguntar.

Kaleem Ullah
fonte
sim!!! Não acho que seja um bug, embora seja um problema comum para o Rails 5. Acho que o Rails fez isso propositalmente, herdando diretamente do ActiveRecord.
Comunidade de
2

Eu estava recebendo um erro semelhante ao tentar executar testes usando rspec.

Eu segui os passos de Малъ Скрылевъ, mas ainda assim terminei. A etapa final que precisei fazer foi carregar meu esquema em meu banco de dados de teste usando:

RAILS_ENV=test rake db:schema:load

Depois disso, o problema foi embora e eu pude passar para o próximo bug. Espero que isso lhe dê algumas dicas.

Stephen
fonte
2

Remova a pasta Admin e execute o rake novamente.

Roberto Capelo
fonte
2

(Eu sei que isso é antigo, mas para futuros googlers)

Você está usando devise? Eu sei que especificamente omniauthableé um problema, mas talvez outros também. Não tem que ser deviseembora. Genericamente, a solução é comentar o modelo ofensivo, a classe, o que for, e descomentar quaisquer seções solicitadas pelos erros.

Para mim, o que estava acontecendo é que deviseler o Usermodelo para ver o que você tem como argumentos para devise(o método de classe ou seja devise :database_authenticatable, :registerable #etc)

Mas, ele irá ler todo o arquivo e se este não for um projeto novo, ele pode ser confundido por outros métodos de classe que dependem de outras coisas (no meu caso era a friendly_idgema, e então umalias_method

A resposta foi comentar o Usermodelo, exceto nas deviselinhas * e rake db:schema:loaddeve funcionar bem.

  • caso contrário, recebo este erro:

    ArgumentError: Mapeando omniauth_callbacks em um recurso que não é omniautável. Adicione devise :omniauthableao Usermodelo

MCB
fonte
2

Se você receber este erro durante a migração, certifique-se de que o nome do seu modelo esteja no plural

por exemplo.

add_column :images, :url, :string
Stevec
fonte
1

A causa mais provável é que seu rake está usando um ambiente diferente do database.yml do seu servidor web.

techvineet
fonte
Oi, como posso ter certeza disso? tem algum comando que eu possa colocar no terminal?
Naomi K
e como você está iniciando seu servidor web?
techvineet
Estou apenas executando localmente agora usando rails s no terminal
Naomi K
1

Eu tive esse problema e ele acabou sendo causado pela API Grape . Percebi no rastreamento da pilha que o arquivo de rotas estava sendo lido durante a migração.

Em routes.rb, a API Grape é montada

mount API::Base => '/'

E na API havia referências ao modelo ausente. Então, graças a esta resposta coloquei-o em um bloco que detecta se está sendo executado pelo servidor ou durante a migração.

unless ( File.basename($0) == "rake" && ARGV.include?("db:migrate") )
    mount API::Base => '/'
end

E funcionou.

Julian Mann
fonte
1

Eu estava tendo o seguinte erro e fazendo uma pesquisa em todo o código do meu aplicativo, pois type_zonesnão consegui encontrar. Também olhei o banco de dados e ele foi atualizado.

Acontece que era um arquivo em luminárias /test/fixtures/type_zones.ymlque estava causando o problema.

ERROR["test_should_get_new", UsersControllerTest, 0.47265757399145514]
test_should_get_new#UsersControllerTest (0.47s)
ActiveRecord::StatementInvalid:  ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "type_zones" does not exist
    LINE 1: DELETE FROM "type_zones"
                        ^
    : DELETE FROM "type_zones"
Juliangonzalez
fonte
1

Pra quem ainda está com esse problema, no meu caso, era minha fábrica no FactoryGirl que estava provocando esse erro.

Estava tentando adicionar referência via '.new' ou '.create'.

Mateus luiz
fonte
0

No meu caso, tive que comentar 2 ActiveAdmin arquivos. Aqui foram meus passos:

  1. Erro inicial / rastreamento de pilha (observe que estamos usando Solrneste projeto): ⇒ rkdbm java version "1.7.0_25" Java(TM) SE Runtime Environment (build 1.7.0_25-b15) Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode) => Solr is already running rake aborted! PG::UndefinedTable: ERROR: relation "discussions" does not exist LINE 5: WHERE a.attrelid = '"discussions"'::regclass ^ : SELECT a.attname, format_type(a.atttypid, a.atttypmod), pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = '"discussions"'::regclass AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/app/admin/users.rb:25:in block in <top (required)>' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/app/admin/users.rb:1:in' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/routes.rb:3:in block in <top (required)>' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/routes.rb:1:in' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/environment.rb:5:in `' Tasks: TOP => db:migrate => environment (See full trace by running task with --trace)

Comentei o app/admin/discussions.rbarquivo de acordo com a resposta da Arcolye acima e tentei migrar meu banco de dados novamente.

Mesmo erro.

Eu olhei para o rastreamento de pilha um pouco mais de perto e percebi que, de fato, app/admin/users.rb:25estava lançando a exceção - e com certeza, esse arquivo depende da minha discussionstabela (via execuçãoDiscussion.all ).

Finalmente, comentar o conteúdo de users.rbme permitiu finalmente migrar meu banco de dados com sucesso.

FYI: há uma discussão aqui em ActiveAdminsobre se que gem deve carregar o banco de dados quando necessário.

mecampbellsoup
fonte
0

Então, tendo o mesmo problema agora. Lembre-se de ter apenas um modelo em cada migração. Isso resolveu para mim.

Eu encontrei a resposta aqui.

Rex
fonte
0

Eu estava pegando o erro:

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "users" does not exist
LINE 8:                WHERE a.attrelid = '"users"'::regclass

Acabou sendo uma solução super fácil. Copiei os arquivos de uma versão mais antiga do projeto e esqueci de aninhá-los dentro de uma pasta "migrar". Quando fiz isso, resolvi o problema para mim.

John Chriest
fonte
0

isso geralmente pode acontecer quando você usa o tipo errado de associação entre os modelos, verifique se há dependência de destruição e associações has_many, por exemplo:

maneira errada que pode causar este problema:

article.rb

 has_many :subcategories, through: :categories, dependent: :destroy

subcategory.rb

has_and_belongs_to_many :articles

caminho certo:

article.rb

 has_many :subcategories, through: :categories, dependent: :destroy

subcategory.rb

declare association with categories here not articles (belongs_to / has_many_and_belongs_to)
milaziggy
fonte