it-swarm.com.de

PG undefinedtable Fehlerrelation Benutzer existiert nicht

Ich sehe diese Frage schon vorher, aber nur für rspec. Ich bin noch nicht erschaffen, weil es für mich zu weit fortgeschritten ist, aber eines Tages werde ich es tun! : P 

Ich erhalte diese Fehlermeldung, wenn ich versuche, mich mit meiner App anzumelden/einzuloggen. Ich bin mir nicht sicher, wo ich suchen muss, um das Problem zu beheben. Ich benutze devise, um meinen Benutzer zu erstellen, und auch omniauth2, um mich mit google anzumelden. 

das ist der Fehler

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

Ich habe rake db:migrate ausprobiert, aber es ist bereits erstellt, in Schematabellen existieren Benutzer. Hat jemand diesen Fehler schon mal bekommen? 

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:

Vielen Dank!

76
Naomi K

Zuerst müssen Sie alle Verbindungen von der Datenbank trennen. Standardmäßig verwenden Sie die Umgebung Entwicklung. Versuchen Sie dann, die Datenbank mit den folgenden Einstellungen zurückzusetzen:

rake db:reset

Der Rake-Befehl db: reset löscht die Datenbank und richtet sie erneut ein. Dies ist funktional gleichbedeutend mit Rake db: drop db: setup.

Dies ist nicht dasselbe wie das Ausführen aller Migrationen. Es wird nur die .__ verwendet. Inhalt der aktuellen schema.rb-Datei. Wenn eine Migration nicht rückgängig gemacht werden kann, rake db: reset kann dir nicht helfen. Weitere Informationen zum Dumping des Schemas finden Sie unter Abschnitt "Schema-Dumping und Sie". Rails Docs

Wenn der Trick nicht hilft, löschen Sie die Datenbank und erstellen Sie sie erneut. Migrieren Sie die Daten. Wenn Sie Samen haben, säen Sie die Datenbank:

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

oder kurz (seit 3.2):

rake db:migrate:reset db:seed

Da db:migrate:reset das Ablegen impliziert, erstellen und migrieren Sie die Datenbank. Da die Standardumgebung für rakeEntwicklung ist, sollten Sie, falls Sie die Ausnahme in den Spezifikationstests sehen, die Datenbank für die Umgebung test wie folgt neu erstellen:

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

oder indem Sie einfach das migrierte Schema laden:

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

In den meisten Fällen wird die Testdatenbank während der Testprozeduren gesät, sodass die Taskaktion db:seed nicht übergeben werden muss. Ansonsten müssen Sie die Datenbank vorbereiten (dies ist in Rails 4 veraltet):

rake db:test:prepare

und dann (wenn es tatsächlich benötigt wird):

Rails_ENV=test rake db:seed

Bei neueren Versionen von Rails kann der Fehler ActiveRecord :: NoEnvironmentInSchemaError erhöht werden. Stellen Sie daher den Tasks eine Task-Task für die Datenbankumgebung voran: db: environment: set:

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

Ihre Testdatenbank ist nicht für rspec bereit.

Bereiten Sie Ihre Testdatenbank für rspec vor, um diesen Fehler zu beheben

Rails_ENV=test rake test:prepare

Es werden Migrationen gelöscht, erstellt und Ihrer Testdatenbank hinzugefügt

Falls die Rake-Task mit einer Nachricht wie 'PG :: Error: ERROR: Datenbank "[Ihr_db_test]" abgebrochen wird, wird diese von anderen Benutzern ausgeführt

Rails_ENV=test rake db:migrate
14
Serge Seletskyy

Ich stoße auf diesen Fehler und nach meiner Recherche existiert einer der Grund für PG undefinedtable Fehlerrelation Benutzer nicht Fehler ist. 

Dieser Fehler ist ein Migrationsfehler. Möglicherweise haben Sie ein neues Modell mit einigen Datenbankattributen erstellt. Nach dem Erstellen des Modells müssen Sie Attribute in Ihr Rails-App-Schema migrieren. 

Wenn Sie einen lokalen Computer für die Entwicklung verwenden, können Sie den Befehl verwenden 

rake db:migrate

Wenn Sie Heroku verwenden 

heroku run rake db:migrate
12
supritshah1289

Ich hatte einen ähnlichen Fehler. Der Grund meines Fehlers war, dass ich in meiner factories.rb-Datei einen Verweis auf ein Rails-Modell hatte. Es wurde also ein Fehler beim Laden verursacht. Das Update bestand darin, die Referenz in einen Block oder {} zu packen, so dass die Ausführung verzögert wird.

Hier war der BROKEN Code:

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

Und es war ein Fehler, weil User beim Laden von factories.rb nicht definiert wurde. Ich habe den User.new-Aufruf in einen Block gehüllt und das Problem wurde behoben:

Fester Code:

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

Hinweis: Es ist wahrscheinlich nicht empfehlenswert, Ihr Modell so zu nennen, aber es war eine Lösung, um DRY meinen Code aufzurufen.

12
ehc

Beim Ausführen von rspec wurde auch diese Fehlermeldung angezeigt:

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

Es wurde für mich gelöst, nachdem ich gerannt war

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

Dies wird häufig durch einen Fehler in ActiveAdmin verursacht. So umgehen Sie den Fehler:

Wenn Sie ActiveAdmin verwenden, geben Sie an, welche Tabelle nicht vorhanden ist, und kommentieren Sie den Inhalt dieser ActiveAdmin-Rb-Datei aus.

Kommentieren Sie beispielsweise für diesen Fall PGError: ERROR: relation "users" does not exist den gesamten Inhalt von app/admin/users.rb aus und geben Sie das Kommentarzeichen aus, nachdem Sie die Migration durchgeführt haben.

10
Arcolye

Dieses Problem wurde für mich von Factory Girl Rails verursacht. Ich würde denjenigen, die es verwenden, empfehlen, den Ordner specs/factories in specs/temp umzubenennen und zu versuchen

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

Wenn es passiert, haben Sie gerade gefunden, was es verursacht hat. Eine schnelle Suche durch das Factory Girl Rails-Juwel Github Repo half mir, das Problem zu erkennen.

Die Fabriken scheiterten, weil ich versuchte, ein Modell zu instanziieren, das beim Ausführen nicht existierte! Codebeispiel unten: 

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

Das Einkapseln des Arrays in einem Block (Hinzufügen von {}) beendete die Korrektur für mich. Beachten Sie, dass payment_options im Beispiel mehr als eine Zahlungsoption haben kann ...

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

Weitere Informationen finden Sie im Abschnitt Dynamische Attribute der Factory Girl Rails-Dokumente .

Vergessen Sie nicht, Ihren Fabrikordner wieder umzubenennen!

6
Igi Manaloto

::Migration[5.0]fehlte in Migrationen . anstatt den Syntaxfehler zu werfen es wirft 

PG :: UndefinedTable: ERROR: Beziehungsrollen sind nicht vorhanden

nachdem ich Stunden verschwendet hatte, stellte ich fest, dass die Migration fehlt::Migration[5.0].

Fehlerhafte Migration:

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

Feste und korrekte Migration

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

Dies könnte ein Fehler bei Rails sein und könnte jemandem helfen, anstatt zu kämpfen und sich zu fragen.

3
Kaleem Ullah

Ich hatte dieses Problem, nachdem ich die Benutzertabelle gelöscht hatte. Lösungen veränderten sich

change_table(:users)

zu

create_table(:users)
3
KnuturO

Ich stand vor demselben Problem und entdeckte die folgende Lösung.

Stellen Sie sicher, dass Sie alle folgenden Anmeldeinformationen in die Datei database.yml eingegeben haben und diese korrekt sind:

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

Beim Versuch, Tests mit rspec auszuführen, wurde ein ähnlicher Fehler angezeigt.

Ich folgte den Schritten von Малъ Скрылевъ, endete aber trotzdem knapp. Der letzte Schritt, den ich machen musste, war das Laden meines Schemas in meine Testdatenbank mit: 

Rails_ENV=test rake db:schema:load

Danach ging das Problem weg und ich konnte mit dem nächsten Fehler fortfahren. Hoffentlich gibt Ihnen das einen Einblick.

2
Stephen

Entfernen Sie den Admin-Ordner und führen Sie Rake erneut aus.

2
Roberto Capelo

(Ich weiß, das ist alt, aber für zukünftige Googler)

Verwenden Sie devise? Ich weiß, dass omniauthable ein Problem ist, aber vielleicht auch andere. Es muss jedoch nicht devise sein. Generell besteht die Lösung darin, das fehlerhafte Modell, die Klasse oder was auch immer auszufiltern und die Abschnitte zu kommentieren, für die die Fehler erforderlich sind.

Für mich ist Folgendes passiert: devise liest das User-Modell, um zu sehen, was Sie als Argumente für devise haben (die Klassenmethode D.h. devise :database_authenticatable, :registerable #etc)

Es wird jedoch die gesamte Datei gelesen, und wenn es sich nicht um ein neues Projekt handelt, kann dies durch andere Klassenmethoden ausgelöst werden, die auf andere Dinge angewiesen sind (in meinem Fall war es der friendly_id gem und dann ein alias_method

Die Antwort bestand darin, das User-Modell auszukommentieren, mit Ausnahme der devise-Zeilen *, und rake db:schema:load sollte einwandfrei laufen.

  • ansonsten habe ich diesen Fehler erhalten:

    ArgumentError: Zuordnung von omniauth_callbacks auf eine Ressource, die nicht omniauthable ist Fügen Sie dem Modell Userdevise :omniauthable hinzu

1
MCB

Die wahrscheinlichste Ursache ist, dass Ihr Rake eine andere Umgebung als database.yml verwendet als Ihr Webserver.

1
techvineet

Ich hatte dieses Problem und es stellte sich heraus, dass es von Grape API verursacht wurde. In der Stack-Ablaufverfolgung ist mir aufgefallen, dass die Routendatei während der Migration gelesen wurde.

In routen.rb ist das Trauben-API montiert

mount API::Base => '/'

Und in der API gab es Hinweise auf das fehlende Modell. Dank dieser Antwort habe ich es in einen Block gesetzt, der feststellt, ob er vom Server oder während der Migration läuft.

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

Und es hat funktioniert.

1
Julian Mann

Also jetzt das gleiche Problem. Denken Sie daran, bei jeder Migration nur ein Modell zu verwenden. Das hat es für mich gelöst. 

Ich bin hier auf die Antwort gestoßen.

0
Rex

Wenn Sie diesen Fehler während der Migration erhalten, stellen Sie sicher, dass Ihr Modellname mehrere ist 

z.B. 

add_column :images, :url, :string
0
user5783745

In meinem Fall musste ich 2ActiveAdmin-Dateien auskommentieren. Hier waren meine Schritte:

  1. Anfangsfehler/stacktrace (Hinweis: Wir verwenden Solr für dieses Projekt): ⇒ 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'/Benutzer/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/stackbuilder/AchieveX/config/environment.rb: 5: in `' Aufgaben: TOP => db: migrate => Umgebung (Siehe vollständige Ablaufverfolgung durch Ausführen einer Task mit --trace) </ code>

Ich änderte die app/admin/discussions.rb-Datei per Arcolyes Antwort oben aus und versuchte erneut, meine Datenbank zu migrieren. 

Gleicher Fehler.

Ich sah mir den Stacktrace etwas genauer an und bemerkte, dass app/admin/users.rb:25 die Ausnahme auslöste - und diese Datei hat tatsächlich eine Abhängigkeit von meiner discussions-Tabelle (über das Ausführen von Discussion.all).

Durch das Auskommentieren des Inhalts von users.rb konnte ich schließlich meine Datenbank erfolgreich migrieren.

Zu Ihrer Information: Es gibt eine Diskussion hier in ActiveAdmin, ob der Edelstein die Datenbank bei Bedarf laden soll.

0
mecampbellsoup

Für alle, die dieses Problem immer noch hatten, war in meiner Fabrik in FactoryGirl der Fehler aufgetreten. 

Ich habe versucht, einen Verweis über '.new' oder '.create' hinzuzufügen.

0
Mateus Luiz

Ich habe den Fehler entdeckt:

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

Es stellte sich als eine sehr einfache Lösung heraus. Ich hatte Dateien von einer älteren Version des Projekts kopiert und vergessen, sie in einem "Migrate" -Ordner zu verschachteln. Als ich das tat, löste es das Problem für mich.

0
John Chriest

Ich hatte den folgenden Fehler und suchte in meinem gesamten Anwendungscode nach type_zones nach. Ich konnte ihn nicht finden. Ich habe mir auch die DB angesehen und sie wurde aktualisiert.

Es stellte sich heraus, dass es sich um eine Datei unter Fixtures /test/fixtures/type_zones.yml handelt, die den Fehler verursacht hat.

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