PG Non définissable error relation users n'existe pas

je vois cette question avant, mais seulement pour rspec. Je ne suis pas encore créer test parce que son trop d'avance pour moi, mais un jour bientôt je le ferai! : P

je reçois cette erreur lorsque j'essaie de m'inscrire/ me connecter avec mon application. Je ne sais pas où chercher à le résoudre. J'utilise devise pour créer mon 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 schema des utilisateurs existent. a toute personne d'obtenir cette erreur avant?

de la base de données.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:

Merci!

70
demandé sur Малъ Скрылевъ 2013-09-30 19:03:25

20 réponses

dans un premier temps, vous devez détacher toutes les connexions hors de la base de données. Par défaut, vous utilisez l'environnement development . Ensuite, essayez 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 configurera à nouveau. C'est fonctionnellement équivalent à rake db:abandon de la db:le programme d'installation.

ce n'est pas la même chose que de gérer toutes les migrations. Le contenu du schéma actuel.dossier rb. Si une migration ne peut pas être annulée, rake db:reset peut pas vous aider. Pour en savoir plus sur le dumping du schéma voir Schéma de décharge et vous section. Rails Docs

si l'astuce n'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:reset implique de chute, de créer et de migration de la db. Parce que l'environnement par défaut pour rake est développement , dans le cas où vous voyez l'exception dans les tests spec, vous devriez recréer db pour le test environnement comme suit:

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

ou avec juste le chargement de la migré régime:

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

dans la plupart des cas, le test la base de données est ensemencée pendant les procédures d'essai, de sorte que l'action de tâche db:seed n'est pas requise pour être acceptée. Sinon, vous devez préparer la base de données (Ceci est déprécié dans Rails 4 ):

rake db:test:prepare

et ensuite (si elle est réellement requise):

RAILS_ENV=test rake db:seed

sur les nouvelles versions de Rails l'erreur ActiveRecord:: NoEnvironmentInSchemaError peut être augmenté, il suffit de préparer les tâches avec un environnement de base de données tâches: db:environnement:1519130920" :

RAILS_ENV=test rake db:environment:set db:drop db:create db:migrate
96
répondu Малъ Скрылевъ 2018-08-23 14:42:36

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 va supprimer, créer et ajouter des migrations à votre base de données de test

dans le cas où la tâche de ratissage est avortée avec un message comme" PG::Error: ERROR: database "[your_db_test] " est accédé par d'autres utilisateurs 'exécuter celui-ci

RAILS_ENV=test rake db:migrate
14
répondu Serge Seletskyy 2013-10-11 09:59:40

j'ai eu une erreur similaire. La racine de mon erreur était que j'avais une référence à un modèle de Rails dans mes usines.dossier rb. Donc ça a causé un problème d'erreur de charge. Le correctif était d'envelopper la référence dans un bloc ou {} de sorte qu'elle retarde son exécution.

voici le code brisé:

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

et il était errorant parce que User n'a pas été défini quand usines.rb est en cours de chargement. J'ai emballé l'appel User.new dans un bloc et il a résolu la question:

code Fixe:

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

Note: probablement pas besoin d'appeler votre modèle comme ça, mais c'était une solution pour assécher mon code.

12
répondu ehc 2015-01-21 01:49:23

j'ai aussi eu cette erreur en lançant 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 j'ai couru

rake db:test:prepare
rake db:test:load
11
répondu cedricdlb 2014-04-01 22:25:52

je rencontre cette erreur et sur ma recherche une des raisons pour PG relation d'erreur non définissable utilisateurs n'existe pas" erreur 151940920 " est.

cette erreur est une erreur de migration. Vous avez créé le nouveau modèle avec certains attributs de base de données. Après avoir créé model, vous devez migrer les attributs vers votre schéma d'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
11
répondu supritshah1289 2016-08-15 00:39:54

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

si vous utilisez ActiveAdmin, quelle que soit la table PG qui n'existe pas, commentez le contenu de ce fichier ActiveAdmin rb.

par exemple, pour ce cas PGError: ERROR: relation "users" does not exist , commentez le contenu entier de app/admin/users.rb , puis décommentez après que vous avez fait vos migrations.

10
répondu Arcolye 2015-11-05 03:28:31

ce problème pour moi était causé par des rails de fille D'usine. Je recommande à ceux qui l'utilisent de renommer le dossier specs/factories en specs / temp et d'essayer

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

S'il passe, alors vous venez de trouver ce qui en est la cause. Un rapide coup d'oeil à travers la fille de L'usine Rails gem GitHub repo m'a aidé à identifier le problème.

les usines étaient en panne parce que J'essayais d'instancier un modèle qui n'existait pas en courant! 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

encapsulant le tableau dans un bloc (ajoutant {}) a fait la correction 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 Dynamique des Attributs d'une partie de l'Usine de Fille Rails docs pour plus d'info.

N'oubliez pas de renommer vos usines dossier de retour!

6
répondu Igi Manaloto 2016-10-20 23:19:55

j'ai eu ce problème après que j'ai supprimé la table des utilisateurs. des solutions était en train de changer

change_table(:users)

à

create_table(:users)
3
répondu KnuturO 2016-01-20 10:53:04

j'ai eu 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 j'ai dû faire était de charger mon schéma dans ma base de données d'essai 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 ça vous donne une idée.

2
répondu Stephen 2014-10-31 21:09:18

supprimer le dossier administrateur et lancer rake à nouveau.

2
répondu Roberto Capelo 2016-03-22 03:42:29

::Migration[5.0] il manquait dans migrations. au lieu de lancer erreur de syntaxe il lance

PG:: Non définissable: ERREUR: Relation roles does not exist

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 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 bug avec des rails et pourrait aider quelqu'un, au lieu de lutter et de se poser des questions.

2
répondu Kaleem Ullah 2017-05-24 07:20:00

je faisais face au même problème et puis j'ai découvert la solution suivante.

assurez-vous d'avoir entré tous les justificatifs d'identité suivants dans la base de données.fichier yml et qu'ils sont corrects:

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 
2
répondu Muhammad Zubair 2018-09-06 08:38:43

la cause la plus probable est que votre râteau utilise un environnement différent de la base de données.yml de votre serveur.

1
répondu techvineet 2013-09-30 15:37:06

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

utilisez-vous devise ? Je sais que spécifiquement omniauthable est un problème, mais peut-être d'autres aussi. Mais pas forcément devise . De façon générale, la solution consiste à commenter le modèle, la classe, n'importe quoi, et à supprimer les commentaires sur les sections que les erreurs demandent.

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

mais, il lira le dossier entier et si ce n'est pas un nouveau projet, il pourrait se déclencher par d'autres méthodes de classe en se basant sur d'autres choses (dans mon cas, c'était le friendly_id gemme, et puis un alias_method 1519150920"

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

  • sinon j'ai eu cette erreur:

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

1
répondu MCB 2016-05-13 21:10:10

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 des routes était lu pendant la migration.

dans routes.rb le Raisin api est monté

mount API::Base => '/'

et dans L'API étaient des références au modèle manquant. Ainsi, 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("151910920") == "rake" && ARGV.include?("db:migrate") )
    mount API::Base => '/'
end

et ça a marché.

1
répondu Julian Mann 2017-05-23 11:54:44

dans mon cas, je devais commenter 2 ActiveAdmin des dossiers. 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 " /Utilisateurs/matthewcampbell/Sites/code/pile-constructeurs/AchieveX/config/routes.rb: 3: dans block in <top (required)>' /Users/matthewcampbell/Sites/code/stack-builders/AchieveX/config/routes.rb:1:in " /Utilisateurs/matthewcampbell/Sites/code/pile-constructeurs/AchieveX/config/environment.rb:5: ` Tâches: TOP = > db:migrate = > environnement (Voir trace complète par tâches en cours d'exécution avec --trace)

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

même erreur.

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

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

FYI: il y a une discussion ici dans ActiveAdmin pour savoir si ce gem devrait charger la base de données Quand nécessaire.

0
répondu mecampbellsoup 2017-05-23 12:34:30

donc j'ai le même problème que maintenant. N'oubliez pas de n'avoir qu'un seul modèle par migration. Qui a résolu pour moi.

j'ai trouvé la réponse ici.

0
répondu Rex 2016-02-25 00:05:55

j'ai fait l'erreur suivante et j'ai cherché dans tout mon code d'application pour type_zones Je n'ai pas pu le trouver. J'ai aussi regardé le db et il a été mis à jour.

S'avère que c'était un fichier sous les 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
répondu juliangonzalez 2017-02-16 01:24:52

pour tous ceux qui ont encore ce problème, dans mon était mon usine en FactoryGirl qui a déclenché cette erreur.

j'essayais d'ajouter la référence via '.nouveau' ou '.créer".

0
répondu Mateus Luiz 2017-06-21 21:00:11

j'ai été la capture de l'Erreur:

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

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

0
répondu John Chriest 2018-07-20 01:05:15