111 votes

PG erreur de table non définie relation utilisateurs n'existe pas

J'ai vu cette question auparavant, mais seulement pour rspec. Je n'ai pas encore créé de test car c'est trop avancé pour moi, mais un jour bientôt je le ferai! :P

Je reçois cette erreur lorsque j'essaie de m'inscrire/connexionner à mon application. J'ai utilisé devise pour créer un utilisateur et aussi omniauth2 pour se connecter avec google.

Voici 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éé : dans la table de schéma les utilisateurs existent. Quelqu'un a déjà eu cette erreur avant ?

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:

141voto

Tout d'abord, vous devez détacher toutes les connexions de la base de données. Par défaut, vous utilisez l'environnement développement. Ensuite, essayez de réinitialiser la base de données avec la commande suivante :

rake db:reset

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

Ce n'est pas la même chose que d'exécuter toutes les migrations. Elle utilisera seulement 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 l'exportation du schéma, consultez la section Export du schéma et vous. Docs Rails

Si le truc ne fonctionne pas, supprimez la base de données, puis recréez-la, migrez les données, et si vous avez des données de départ, semez la base de données :

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

ou de manière plus concise (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. Comme l'environnement par défaut pour rake est développement, si vous voyez une exception dans les tests d'analyse, vous devriez recréer la base de données pour l'environnement test comme suit :

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

ou simplement 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 pendant les procédures de test, donc l'action de la tâche db:seed n'est pas nécessaire. Sinon, vous devez préparer la base de données (ceci est obsolète dans Rails 4) :

rake db:test:prepare

et ensuite (si cela est réellement nécessaire) :

RAILS_ENV=test rake db:seed

Dans les versions plus récentes de Rails, l'erreur ActiveRecord::NoEnvironmentInSchemaError peut survenir, donc il suffit de préfixer les tâches avec une tâche de définition de l'environnement de la base de données : db:environment:set :

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

23voto

supritshah1289 Points 415

J'ai rencontré cette erreur, et lors de mes recherches, j'ai découvert qu'une des raisons de l'erreur PG undefinedtable error relation users does not exist est :

Cette erreur est une erreur de migration. Vous avez peut-être créé un nouveau modèle avec des attributs de base de données. Après la création du 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

16voto

Serge Seletskyy Points 1859

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

Préparez votre base de données de test pour rspec afin de corriger cette erreur

RAILS_ENV=test rake test:prepare

Cela va supprimer, créer et ajouter des migrations à votre base de données de test

Si la tâche rake est interrompue avec un message du genre 'PG::Error: ERREUR : la base de données "[votre_db_test]" est utilisée par d'autres utilisateurs', exécutez celle-ci

RAILS_ENV=test rake db:migrate

14voto

cedricdlb Points 36

J'ai également rencontré cette erreur lors de l'exécution de rspec :

 Échec/Erreur: 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
 ...

Cela a été résolu pour moi après avoir exécuté

rake db:test:prepare
rake db:test:load

13voto

ehc Points 378

J'ai eu une erreur similaire. La racine de mon erreur était que j'avais une référence à un modèle Rails dans mon fichier factories.rb. Cela a donc causé un problème de chargement. La solution était d'envelopper la référence dans un bloc ou {} pour retarder son exécution.

Voici le code ERRONÉ:

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

Et c'était en erreur parce que User n'était pas défini lorsque factories.rb était chargé. J'ai enveloppé l'appel User.new dans un bloc et cela a résolu le problème:

Code corrigé:

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

Remarque : ce n'est probablement pas la meilleure pratique d'avoir besoin d'appeler votre modèle de cette manière, mais c'était une solution pour simplifier mon code.

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