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:

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

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

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

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.


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

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.


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!


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 

3

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

change_table(:users)

para

create_table(:users)

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.


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.



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


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

1

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


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.


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"

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'.


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.



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.


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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.