web-dev-qa-db-fra.com

La relation d'erreur PG undefinedtable des utilisateurs n'existe pas

Je vois cette question avant, mais seulement pour rspec. Je ne suis pas encore en train de créer un test, car c’est trop avancé pour moi, mais bientôt je le ferai! : P 

Je reçois cette erreur lorsque j'essaie de m'inscrire/de me connecter avec mon application. Je ne sais pas où chercher pour le réparer. Je me suis servi de la fonction de conception pour créer mon utilisateur et de omniauth2 pour me connecter avec google

c'est l'erreur

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'ai essayé rake db:migrate, mais il est déjà créé, les utilisateurs de la table de schéma existent. Quelqu'un at-il eu cette erreur avant? 

database.yml

#   gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
# On Windows:
#   gem install pg
#       Choose the win32 build.
#       Install PostgreSQL and put its /bin directory on your path.
#
# Configure Using Gemfile
# gem 'pg'
#
development:
  adapter: postgresql
  encoding: unicode
  database: tt_intraweb_development
  pool: 5
  username: my_username
  password:

  # Connect on a TCP socket. Omitted by default since the client uses a
  # domain socket that doesn't need configuration. Windows does not have
  # domain sockets, so uncomment these lines.
  #Host: localhost
  #port: 5432

  # Schema search path. The server defaults to $user,public
  #schema_search_path: myapp,sharedapp,public

  # Minimum log levels, in increasing order:
  #   debug5, debug4, debug3, debug2, debug1,
  #   log, notice, warning, error, fatal, and panic
  # The server defaults to notice.
  #min_messages: warning

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
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:

Je vous remercie!

76
Naomi K

Au début, vous devez détacher toutes les connexions de la base de données. Par défaut, vous utilisez l'environnement développement. Puis essayez de réinitialiser la base de données avec les éléments suivants:

rake db:reset

La tâche rake db: reset va supprimer la base de données et la configurer à nouveau. Ceci est fonctionnellement équivalent à rake db: drop db: setup.

Ce n'est pas la même chose que d'exécuter toutes les migrations. Il utilisera uniquement le contenu du fichier schema.rb actuel. Si une migration ne peut pas être annulée, rake db: reset peut ne pas vous aider. Pour en savoir plus sur le vidage du schéma, voir Schéma Dumping et vous section. Rails Docs

Si l'astuce ne vous aide pas, supprimez la base de données, puis recréez-la à nouveau, migrez les données et, si vous avez des graines, semez la base de données:

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

ou à court terme (depuis 3.2):

rake db:migrate:reset db:seed

Puisque db:migrate:reset implique la suppression, la création et la migration de la base de données. Étant donné que l'environnement par défaut pour rake est développement, si vous voyez l'exception dans les tests de spécification, vous devez recréer la base de données pour l'environnement test comme suit:

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

ou juste en chargeant le schéma migré:

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

Dans la plupart des cas, la base de données de test est semée au cours des procédures de test. Il n'est donc pas nécessaire que l'action de tâche db:seed soit transmise. Sinon, vous devez préparer la base de données (ceci est déconseillé dans Rails 4):

rake db:test:prepare

et ensuite (si nécessaire):

Rails_ENV=test rake db:seed

Sur les versions plus récentes de Rails, l'erreur ActiveRecord :: NoEnvironmentInSchemaError peut être générée, il est donc préférable de préfixer les tâches avec une tâche d'ensemble d'environnement de base de données: db: environment: set

Rails_ENV=test rake db:environment:set db:drop db:create db:migrate

Votre base de données de test n'est pas prête pour rspec.

Préparez votre base de données de test pour que rspec corrige cette erreur

Rails_ENV=test rake test:prepare

Il va déposer, créer et ajouter des migrations à votre base de test

Dans le cas où la tâche rake est abandonnée avec le message 'PG :: Error: ERROR: la base de données "[your_db_test]" est utilisée par d'autres utilisateurs

Rails_ENV=test rake db:migrate
14
Serge Seletskyy

Je rencontre cette erreur et sur ma recherche une des raisons pour PG utilisateurs de relation d'erreur indéterminée n'existe pas erreur est 

Cette erreur est une erreur de migration. Vous avez peut-être créé un nouveau modèle avec certains attributs de base de données. Après avoir créé le modèle, vous devez migrer les attributs vers le schéma de votre application Rails. 

Si vous utilisez une machine locale pour le développement, vous pouvez utiliser la commande 

rake db:migrate

Si vous utilisez heroku 

heroku run rake db:migrate
12
supritshah1289

J'ai eu une erreur similaire. La racine de mon erreur est que j'ai eu une référence à un modèle Rails dans mon fichier factories.rb. Cela a donc provoqué une erreur de chargement. Le correctif consistait à envelopper la référence dans un bloc ou {} afin de retarder son exécution.

Voici le code BROKEN:

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

Et c'était une erreur, car User n'était pas défini lors du chargement de factories.rb. J'ai encapsulé l'appel User.new dans un bloc et le problème a été résolu:

Code fixe:

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

Remarque: Il n'est probablement pas recommandé de faire appel à votre modèle de cette manière, mais il s'agissait d'une solution pour DRY mon code.

12
ehc

Je recevais aussi cette erreur lors de l'exécution de 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
 ...

Il a été résolu pour moi après avoir couru

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

Ceci est souvent causé par un bogue dans ActiveAdmin. Voici comment contourner le bug:

Si vous utilisez ActiveAdmin, quelle que soit la table indiquée par PG, commentez le contenu de ce fichier rb ActiveAdmin.

Par exemple, dans ce cas, PGError: ERROR: relation "users" does not exist, commentez l'intégralité du contenu de app/admin/users.rb, puis supprimez la mise en commentaire une fois vos migrations effectuées.

10
Arcolye

Ce problème pour moi était causé par Factory Girl Rails. Je recommanderais à ceux qui l'utilisent de renommer le dossier specs/factories en specs/temp et d'essayer

Rails_ENV = votre ensemble environnement exec rake db: migrate --trace

Si cela passe, alors vous venez de trouver ce qui le causait. Un coup d'œil rapide dans le gem github repo de Factory Girl Rails m'a aidé à identifier le problème.

Les usines échouaient parce que j'essayais d'instancier un modèle qui n'existait pas à l'exécution! Exemple de code ci-dessous: 

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

Encapsuler le tableau dans un bloc (en ajoutant {}) a résolu le problème pour moi. Notez que payment_options peut prendre plusieurs options de paiement dans l'exemple ...

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

Reportez-vous à la partie Attributs dynamiques des documents Factory Girl Rails pour plus d'informations.

N'oubliez pas de renommer votre dossier usines!

6
Igi Manaloto

::Migration[5.0]manquait dans les migrations . au lieu de lancer erreur de syntaxe il lève 

PG :: UndefinedTable: ERROR: les rôles de relation n'existent pas

après avoir perdu des heures, j'ai finalement compris que la migration manquait::Migration[5.0].

Migration erronée:

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

Migration fixe et correcte

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

Cela pourrait être un problème avec Rails et pourrait aider quelqu'un au lieu de se débattre et de se poser des questions.

3
Kaleem Ullah

J'ai eu ce problème après avoir supprimé la table des utilisateurs. les solutions changeaient

change_table(:users)

à

create_table(:users)
3
KnuturO

Je faisais face au même problème et j’ai découvert la solution suivante.

Assurez-vous que vous avez entré toutes les informations d'identification suivantes dans le fichier database.yml et qu'elles sont correctes:

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
Muhammad Zubair

J'obtenais une erreur similaire en essayant d'exécuter des tests avec rspec.

J'ai suivi les pas de Малъ Скрылевъ mais j'ai quand même fini court. La dernière étape que je devais faire était de charger mon schéma dans ma base de données de test en utilisant: 

Rails_ENV=test rake db:schema:load

Après cela, le problème est parti et je pouvais passer au bogue suivant. Espérons que cela vous donne un aperçu.

2
Stephen

Supprimez le dossier Admin et exécutez à nouveau rake.

2
Roberto Capelo

(Je sais que c'est vieux, mais pour les futurs googlers)

Utilisez-vous devise? Je sais que spécifiquement omniauthable est un problème, mais peut-être d’autres aussi. Cela ne doit pas nécessairement être devise. Généralement, la solution consiste à commenter le modèle, la classe, tout ce qui ne va pas, et à ne pas commenter les sections demandées par les erreurs.

Pour moi, ce qui se passait, c'est que devise lit le modèle User pour voir ce que vous avez comme arguments pour devise (la méthode de classe C'est-à-dire. devise :database_authenticatable, :registerable #etc).

Mais, il lira l’ensemble du fichier et si ce n’est pas un nouveau projet, il risque d’être déclenché par d’autres méthodes de classe reposant sur d’autres éléments (dans mon cas, c’était le friendly_id gem, puis un alias_method

La réponse a été de commenter le modèle User à l'exception des devise lignes (s) * et rake db:schema:load devraient fonctionner correctement.

  • sinon j'ai cette erreur:

    ArgumentError: Mappage omniauth_callbacks sur une ressource qui n'est pas omniauthable Veuillez ajouter devise :omniauthable au modèle User.

1
MCB

La cause la plus probable est que votre rake utilise un environnement différent de database.yml et de votre serveur Web.

1
techvineet

J'ai eu ce problème et il s'est avéré être causé par API de raisin . J'ai remarqué dans la trace de la pile que le fichier de routes était en cours de lecture pendant la migration.

Dans routes.rb, l'api Grape est monté

mount API::Base => '/'

Et dans l'API, il y avait des références au modèle manquant. Donc, grâce à cette réponse je l’ai mise dans un bloc qui détecte si elle est exécutée par le serveur ou pendant la migration.

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

Et ça a fonctionné.

1
Julian Mann

Donc, avoir le même problème tout à l'heure. N'oubliez pas d'avoir un seul modèle dans chaque migration. Cela l'a résolu pour moi. 

Je suis tombé sur la réponse ici.

0
Rex

Si vous obtenez cette erreur lors de la migration, assurez-vous que votre nom de modèle est au pluriel. 

par exemple. 

add_column :images, :url, :string
0
user5783745

Dans mon cas, je devais commenter 2ActiveAdmin fichiers. Voici mes pas:

  1. Erreur initiale/stacktrace (notez que nous utilisons Solr sur ce projet): ⇒ 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/empileurs/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/constructeurs de pile/AchieveX/config/environment.rb: 5: dans `' Tâches: TOP => db: migrate => environment (Voir la trace complète en exécutant la tâche avec --trace) </ code>

J'ai commenté le fichier app/admin/discussions.rb conformément à la réponse d'Arcolye ci-dessus et j'ai essayé de migrer à nouveau ma base de données. 

Même erreur.

J'ai regardé la pile de plus près et j'ai remarqué qu'en fait, app/admin/users.rb:25 lançait l'exception - et ce fichier a une dépendance sur ma table discussions (via l'exécution de Discussion.all).

Enfin, commenter le contenu de users.rb m'a permis de migrer enfin ma base de données avec succès.

Pour votre information: il y a une discussion ici dans ActiveAdmin sur le point de savoir si cette gemme devrait charger la base de données si nécessaire.

0
mecampbellsoup

Pour ceux qui ont encore ce problème, mon usine de FactoryGirl était à l’origine de cette erreur. 

J'essayais d'ajouter une référence via ".new" ou ".create".

0
Mateus Luiz

J'attrapais l'erreur:

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

Cela s'est avéré être une solution super facile. J'avais copié des fichiers d'une ancienne version du projet et j'avais oublié de les imbriquer dans un dossier "migrate". Quand j'ai fait ça, ça a résolu le problème pour moi.

0
John Chriest

J'avais l'erreur suivante et fais une recherche dans tout mon code d'application pour type_zones Je n'ai pas pu le trouver. J'ai aussi regardé la base de données et il a été mis à jour.

Il s'avère que c'était un fichier sous fixtures /test/fixtures/type_zones.yml qui causait le problème.

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"
0
juliangonzalez