Les utilisateurs de relation d'erreur PG undefinedtable n'existe pas

92

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

J'obtiens cette erreur lorsque j'essaye de m'inscrire / me connecter à mon application. J'ai utilisé la conception pour créer l'utilisateur et aussi 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éé: dans la table de schéma, les utilisateurs existent. Quelqu'un a-t-il déjà eu cette erreur?

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
la source
Une réponse a-t-elle été utile?
Малъ Скрылевъ
Pas pour moi, avoir la même erreur et aucune des réponses n'a été utile.
Gustavo Semião-Lobo
@GustavoLobo avez-vous mis en place une propermigration?
Малъ Скрылевъ
8
En fait, j'avais tort, désolé pour ça. RAILS_ENV=test rake db:migratetravaillé pour moi.
Gustavo Semião-Lobo

Réponses:

118

Dans un premier temps, vous devez détacher toutes les connexions de la base de données. Par défaut, vous utilisez l' environnement de développement . Essayez ensuite de réinitialiser la base de données avec ce qui suit:

rake db:reset

La tâche rake db: reset supprimera la base de données et la réinitialisera. C'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, consultez la section Le vidage du schéma et vous. Documents sur les rails

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 en bref (depuis 3.2):

rake db:migrate:reset db:seed

Depuis db:migrate:resetimplique de supprimer, créer et migrer le fichier db. Étant donné que l'environnement par défaut pour rakeest le développement , au cas où vous voyez l'exception dans les tests de spécification, vous devez recréer la base de données pour l' environnement de test comme suit:

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

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

rake db:test:prepare

et puis (si c'est réellement nécessaire):

RAILS_ENV=test rake db:seed

Sur les versions plus récentes de Rails, l'erreur ActiveRecord :: NoEnvironmentInSchemaError peut être augmentée, alors ajoutez simplement les tâches avec une tâche de jeu d'environnement de base de données: db: environment: set :

RAILS_ENV=test rake db:environment:set db:drop db:create db:migrate
Малъ Скрылевъ
la source
pour moi - RAILS_ENV = test rake db: drop db: create db: schema: load works, merci pour la réponse. Super
AMIC MING
rake db:test:prepareFait le travail.
Francisco Quintero
Merci M. vous venez de me sauver la vie. J'essaye de déposer, de créer, de migrer, d'installer mais aucune de ces commandes ne fonctionne jusqu'à ce que j'essaye de vous commander rake db:reset. La magie arrive mec!
Travis Le
18

J'ai rencontré cette erreur et, lors de mes recherches, j'ai découvert que l'une des raisons pour lesquelles les utilisateurs de relation d'erreur PG undefinedtable n'existe pas 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
supritshah1289
la source
3
Excellent! Pour les rails 5, vous devez utiliser 'heroku run rails db: migrate'
Raphael Onofre
1
Cela a fonctionné pour moi. J'avais besoin de courir rake db:migrate. Merci.
Promise Preston
14

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 pour corriger cette erreur

RAILS_ENV=test rake test:prepare

Il supprimera, créera et ajoutera des migrations à votre base de données de test

Dans le cas où la tâche rake est abandonnée avec un message comme 'PG :: Error: ERROR: la base de données "[your_db_test]" est accédée par d'autres utilisateurs, exécutez celle-ci

RAILS_ENV=test rake db:migrate
Serge Seletskyy
la source
12

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 d'erreur de chargement. Le correctif consistait à envelopper la référence dans un bloc ou {}à 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 elle Usern'était pas définie lorsque factories.rb était en cours de chargement. J'ai enveloppé l' User.newappel dans un bloc et cela a résolu le problème:

Code fixe:

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

Remarque: ce n'est probablement pas la meilleure pratique pour appeler votre modèle comme ça, mais c'était une solution pour DRY mon code.

hein
la source
Quelqu'un peut-il expliquer pourquoi ce n'est probablement pas la meilleure pratique d'appeler votre modèle? Je suis d'accord avec les avantages de DRY ... quels sont les inconvénients? Merci!
theUtherSide
11

J'obtenais également 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
 ...

C'était résolu pour moi après avoir couru

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

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

Si vous utilisez ActiveAdmin, quelle que soit la table selon PG qui n'existe pas, mettez en commentaire 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 décommentez après avoir effectué vos migrations.

Arcolye
la source
Seul cela a fonctionné pour moi. Tu m'as sauvé la vie frérot! Merci
micper
5

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

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

Si cela réussit, vous venez de trouver ce qui en était la cause. Une fouille rapide dans le dépôt github de gemmes 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 lors de 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 (ajouter {}) a fait le correctif pour moi. Notez que payment_options peut prendre plus d'une option de paiement dans l'exemple ...

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

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

N'oubliez pas de renommer votre dossier usines!

Igi Manaloto
la source
4

J'étais confronté 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 
Muhammad Zubair
la source
3

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

change_table(:users)

à

create_table(:users)
KnuturO
la source
3

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

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

après avoir perdu des heures, j'ai finalement compris que la migration était manquante ::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 corrigée 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 bug avec des rails et pourrait aider quelqu'un, au lieu de se débattre et de s'interroger.

Kaleem Ullah
la source
Oui!!! Je ne pense pas que ce soit un bogue bien que ce soit un problème courant pour les rails 5. Je pense que les rails l'ont fait exprès en héritant d'ActiveRecord.
Communauté le
2

J'obtenais une erreur similaire en essayant d'exécuter des tests à l'aide de rspec.

J'ai suivi les pas de Малъ Скрылевъ mais j'ai quand même échoué. 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 a disparu et j'ai pu passer au bogue suivant. J'espère que cela vous donne un aperçu.

Stephen
la source
2

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

Roberto Capelo
la source
2

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

Utilisez-vous devise? Je sais précisément que omniauthablec'est un problème, mais peut-être d'autres aussi. Cela n'a pas à l'être devisecependant. De manière générale, la solution consiste à mettre en commentaire le modèle, la classe, etc., et à annuler les commentaires des sections demandées par les erreurs.

Pour moi, ce qui se passait est de deviselire le Usermodèle pour voir ce que vous avez comme arguments devise(la méthode de classe ie devise :database_authenticatable, :registerable #etc)

Mais, il lira tout le fichier et s'il ne s'agit pas d'un nouveau projet, il pourrait être déclenché par d'autres méthodes de classe reposant sur d'autres choses (dans mon cas, c'était le friendly_idjoyau, puis unalias_method

La réponse a été de commenter le Usermodèle à l'exception des deviselignes * et rake db:schema:loaddevrait fonctionner correctement.

  • sinon j'ai eu cette erreur:

    ArgumentError: Mappage de omniauth_callbacks sur une ressource qui n'est pas omniauthable Veuillez ajouter devise :omniauthableau Usermodèle

MCB
la source
2

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

par exemple.

add_column :images, :url, :string
stevec
la source
1

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

techvineet
la source
Salut, comment est-ce quelque chose dont je peux être sûr? y a-t-il une commande que je peux mettre dans le terminal?
Naomi K
et comment démarrez-vous votre serveur Web?
techvineet
Je cours juste localement en ce moment en utilisant des rails dans le terminal
Naomi K
1

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

Dans routes.rb, l'API Grape est montée

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 mis dans un bloc qui détecte s'il est exécuté par le serveur ou pendant la migration.

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

Et ça a marché.

Julian Mann
la source
1

J'avais l'erreur suivante et faisais une recherche dans tout mon code d'application car type_zonesje ne pouvais pas le trouver. J'ai également regardé la base de données et elle a été mise à jour.

Il s'avère que c'était un fichier sous les appareils /test/fixtures/type_zones.ymlqui 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"
juliangonzalez
la source
1

Pour tous ceux qui ont encore ce problème, dans mon cas, c'est mon usine dans FactoryGirl qui a déclenché cette erreur.

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

Mateus Luiz
la source
0

Dans mon cas, j'ai dû commenter 2 ActiveAdmin fichiers. Voici mes étapes:

  1. Erreur initiale / stacktrace (note que nous utilisons Solrsur 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/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)

J'ai commenté le app/admin/discussions.rbfichier selon 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é le stacktrace d'un peu plus près et j'ai remarqué qu'en fait, je lançais app/admin/users.rb:25l'exception - et bien sûr, ce fichier a une dépendance sur ma discussionstable (via l'exécution Discussion.all).

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

Pour votre information: il y a une discussion ici à ActiveAdminsavoir si ce petit bijou devrait charger la base de données en cas de besoin.

mecampbellsoup
la source
0

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

Je suis tombé sur la réponse ici.

Rex
la source
0

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 très simple. J'avais copié des fichiers d'une ancienne version du projet et j'avais oublié de les imbriquer dans un dossier «migrer». Quand j'ai fait cela, cela a résolu le problème pour moi.

John Chriest
la source
0

cela peut généralement se produire lorsque vous utilisez un type d'association incorrect entre les modèles, vérifiez la destruction des dépendances et les associations has_many, par exemple:

mauvaise façon qui peut causer ce problème:

article.rb

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

subcategory.rb

has_and_belongs_to_many :articles

La bonne façon:

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
la source