PG undefinedtable Fehlerbeziehung Benutzer existiert nicht

91

Ich habe diese Frage schon einmal gesehen, aber nur für rspec. Ich habe noch keinen Test erstellt, weil er für mich zu fortgeschritten ist, aber eines Tages werde ich es tun! : P.

Ich erhalte diese Fehlermeldung, wenn ich versuche, mich in meiner App anzumelden. Ich habe devise verwendet, um Benutzer zu erstellen, und omniauth2 , um mich bei 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 es versucht rake db:migrate, aber es ist bereits erstellt: In der Schematabelle sind Benutzer vorhanden. Hat jemand diesen Fehler schon einmal?

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.
quelle
War eine Antwort hilfreich?
18алъ Скрылевъ
Nicht für mich, der gleiche Fehler und keine der Antworten waren hilfreich.
Gustavo Semião-Lobo
@GustavoLobo hast du eine richtige Migration eingerichtet?
Малъ Скрылевъ
8
Eigentlich habe ich mich geirrt, tut mir leid. RAILS_ENV=test rake db:migratearbeitete für mich.
Gustavo Semião-Lobo

Antworten:

117

Zunächst müssen Sie alle Verbindungen aus der Datenbank trennen. Standardmäßig verwenden Sie die Entwicklungsumgebung . Versuchen Sie dann, die Datenbank wie folgt zurückzusetzen:

rake db:reset

Die Aufgabe rake db: reset löscht die Datenbank und richtet sie erneut ein. Dies entspricht funktional Rake db: drop db: setup.

Dies ist nicht dasselbe wie das Ausführen aller Migrationen. Es wird nur der Inhalt der aktuellen Datei schema.rb verwendet. Wenn eine Migration nicht zurückgesetzt werden kann, hilft Ihnen Rake db: reset möglicherweise nicht. Weitere Informationen zum Dumping des Schemas finden Sie im Abschnitt Schema-Dumping und Sie. Rails Docs

Wenn der Trick nicht hilft, löschen Sie die Datenbank, erstellen Sie sie erneut, migrieren Sie die Daten und säen Sie die Datenbank, wenn Sie Seeds haben:

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

oder kurz gesagt (seit 3.2):

rake db:migrate:reset db:seed

Da db:migrate:resetdies das Löschen impliziert, erstellen und migrieren Sie die Datenbank. Da die Standardumgebung für rakeist die Entwicklung , für den Fall , wenn Sie die Ausnahme in spec Tests zu sehen, sollten Sie für die neu erstellen db Testumgebung wie folgt:

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 db:seedkeine Aufgabenaktion übergeben werden muss. Andernfalls 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

In neueren Versionen von Rails kann der Fehler ActiveRecord :: NoEnvironmentInSchemaError auftreten. Stellen Sie den Aufgaben also einfach eine Datenbankumgebung voran. Set task: db: environment: set :

RAILS_ENV=test rake db:environment:set db:drop db:create db:migrate
Малъ Скрылевъ
quelle
für mich - RAILS_ENV = Testrechen db: drop db: create db: schema: load funktioniert, danke für die Antwort. Großartig
AMIC MING
rake db:test:preparemacht den Job.
Francisco Quintero
Danke Herr, du rettest nur mein Leben. Ich versuche zu löschen, zu erstellen, zu migrieren, einzurichten, aber keiner dieser Befehle funktioniert, bis ich versuche, Sie Befehl rake db:reset. Die Magie passiert Mann!
Travis Le
18

Ich bin auf diesen Fehler gestoßen und habe bei meinen Nachforschungen herausgefunden, dass einer der Gründe für Benutzer mit nicht definierbaren PG-Fehlerbeziehungen nicht existiert 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
supritshah1289
quelle
3
Ausgezeichnet! Für Rails 5 müssen Sie 'heroku run Rails db: migrate' verwenden
Raphael Onofre
1
Das hat bei mir funktioniert. Ich musste rennen rake db:migrate. Vielen Dank.
Versprich Preston
14

Ihre Testdatenbank ist nicht bereit für rspec.

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 zu Ihrer Testdatenbank hinzugefügt

Falls die Rake-Task mit der Meldung 'PG :: Error: ERROR: Datenbank "[your_db_test]" abgebrochen wird, auf die andere Benutzer zugreifen, führen Sie diese aus

RAILS_ENV=test rake db:migrate
Serge Seletskyy
quelle
12

Ich hatte einen ähnlichen Fehler. Die Wurzel meines Fehlers war, dass ich in meiner factories.rb-Datei einen Verweis auf ein Rails-Modell hatte. Es verursachte also ein Ladefehlerproblem. Das Update bestand darin, die Referenz in einen Block oder zu verpacken{} , damit 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 fehlerhaft, weil Usernicht definiert wurde, wann factories.rb geladen wurde. Ich habe den User.newAnruf in einen Block eingeschlossen 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 die beste Vorgehensweise, Ihr Modell so aufrufen zu müssen, aber es war eine Lösung, um meinen Code auszutrocknen.

ehc
quelle
Kann jemand bitte erklären, warum es "wahrscheinlich nicht die beste Vorgehensweise ist, Ihr Modell anrufen zu müssen"? Ich stimme den DRY-Vorteilen zu ... was sind die Nachteile? Vielen Dank!
theUtherSide
11

Ich habe diesen Fehler auch beim Ausführen von rspec erhalten:

 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 gelaufen bin

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

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

Wenn Sie ActiveAdmin verwenden, kommentieren Sie den Inhalt dieser ActiveAdmin-RB-Datei aus, je nachdem, welche Tabelle PG als nicht vorhanden bezeichnet.

PGError: ERROR: relation "users" does not existKommentieren Sie in diesem Fall beispielsweise den gesamten Inhalt von aus und kommentieren Sie ihn aus app/admin/users.rb, nachdem Sie Ihre Migrationen durchgeführt haben.

Arcolye
quelle
Nur das hat bei mir funktioniert. Du hast mein Leben gerettet, Bruder! Danke
Micper
5

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

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

Wenn es vorbei ist, haben Sie gerade herausgefunden, was es verursacht hat. Ein kurzer Blick durch das Gem Github Repo von Factory Girl Rails half mir, das Problem zu identifizieren.

Die Fabriken versagten, weil ich versuchte, ein Modell zu instanziieren, das beim Laufen 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 einen Block (Hinzufügen von {}) hat das Problem für mich behoben. Beachten Sie, dass Zahlungsoptionen im Beispiel mehr als eine Zahlungsoption annehmen können ...

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

Weitere Informationen finden Sie im Abschnitt Dynamische Attribute in den Factory Girl Rails-Dokumenten .

Vergessen Sie nicht, Ihren Fabrikordner wieder umzubenennen!

Igi Manaloto
quelle
4

Ich hatte das gleiche Problem und entdeckte dann 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 
Muhammad Zubair
quelle
3

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

change_table(:users)

zu

create_table(:users)
KnuturO
quelle
3

::Migration[5.0]fehlte bei Migrationen. Anstatt einen Syntaxfehler auszulösen, wird ein Fehler ausgelöst

PG :: UndefinedTable: ERROR: Beziehungsrollen existieren nicht

Nachdem ich Stunden verschwendet hatte, stellte ich endlich 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 mit Schienen sein und jemandem helfen, anstatt zu kämpfen und sich zu wundern.

Kaleem Ullah
quelle
Ja!!! Ich denke nicht, dass es ein Fehler ist, obwohl es ein häufiges Problem für Rails 5 ist. Ich denke, Rails hat dies absichtlich direkt von ActiveRecord geerbt.
Gemeinschaft
2

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

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

RAILS_ENV=test rake db:schema:load

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

Stephen
quelle
2

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

Roberto Capelo
quelle
2

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

Benutzt du devise? Ich weiß, dass dies speziell omniauthableein Problem ist, aber vielleicht auch andere. Das muss nicht seindevise . Im Allgemeinen besteht die Lösung darin, das fehlerhafte Modell, die betreffende Klasse usw. auskommentieren und alle Abschnitte, nach denen die Fehler fragen, auskommentieren.

Für mich geschah das deviseLesen des UserModells, um zu sehen, wofür Sie Argumente haben devise(die Klassenmethode, dhdevise :database_authenticatable, :registerable #etc )

Es wird jedoch die gesamte Datei gelesen, und wenn dies kein neues Projekt ist, wird es möglicherweise von anderen Klassenmethoden ausgelöst, die sich auf andere Dinge stützen (in meinem Fall war es das friendly_id Juwel und dann einalias_method

Die Antwort war, das UserModell mit Ausnahme der deviseZeilen * rake db:schema:loadauskommentieren und sollte gut laufen.

  • Ansonsten habe ich diesen Fehler bekommen:

    ArgumentError: Zuordnung von omniauth_callbacks zu einer Ressource, die nicht omniauthable ist Bitte fügen Sie devise :omniauthabledem UserModell hinzu

MCB
quelle
2

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

z.B.

add_column :images, :url, :string
stevec
quelle
1

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

techvineet
quelle
Hallo, wie kann ich mir dessen sicher sein? Gibt es einen Befehl, den ich in das Terminal eingeben kann?
Naomi K
und wie starten Sie Ihren Webserver?
Techvineet
Ich
Naomi K
1

Ich hatte dieses Problem und es stellte sich heraus, dass es durch die Trauben-API verursacht wurde . Ich habe im Stack-Trace festgestellt, dass die Routendatei während der Migration gelesen wurde.

In route.rb ist die Trauben-API montiert

mount API::Base => '/'

Und in der API befanden sich Verweise auf das fehlende Modell. Dank dieser Antwort habe ich sie in einen Block eingefügt, der erkennt, ob sie vom Server oder während der Migration ausgeführt wird.

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

Und es hat funktioniert.

Julian Mann
quelle
1

Ich hatte den folgenden Fehler und habe meinen gesamten Anwendungscode nachgeschlagen, da type_zonesich ihn nicht finden konnte. Ich habe mir auch die Datenbank angesehen und sie wurde aktualisiert.

Es stellte sich heraus, dass es sich um eine Datei unter den Geräten handelte /test/fixtures/type_zones.yml, die das Problem verursachte.

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
quelle
1

Für alle, die immer noch dieses Problem haben, war es in meinem Fall meine Fabrik in FactoryGirl, die diesen Fehler auslöste.

Ich habe versucht, eine Referenz über '.new' oder '.create' hinzuzufügen.

Mateus Luiz
quelle
0

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

  1. Anfänglicher Fehler / Stacktrace (Hinweis, den wir Solrfür dieses Projekt verwenden): ⇒ 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)

Ich habe die app/admin/discussions.rbDatei gemäß der obigen Antwort von Arcolye auskommentiert und versucht, meine Datenbank erneut zu migrieren.

Gleicher Fehler.

Ich habe mir den Stacktrace etwas genauer angesehen und festgestellt, dass tatsächlich app/admin/users.rb:25die Ausnahme ausgelöst wurde - und tatsächlich hat diese Datei eine Abhängigkeit von meiner discussionsTabelle (über die Ausführung)Discussion.all ).

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

Zu Ihrer Information: Es gibt eine Diskussion hier in ActiveAdminetwa , ob das Juwel die Datenbank geladen werden soll , wenn erforderlich.

Mecampbellsoup
quelle
0

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

Ich bin hier auf die Antwort gestoßen.

Rex
quelle
0

Ich habe den Fehler abgefangen:

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

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

John Chriest
quelle
0

Dies kann normalerweise passieren, wenn Sie eine falsche Art der Zuordnung zwischen Modellen verwenden, auf Abhängigkeitszerstörung prüfen und has_many-Zuordnungen haben, zum Beispiel:

Falscher Weg, der dieses Problem verursachen kann:

article.rb

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

Unterkategorie.rb

has_and_belongs_to_many :articles

richtiger Weg:

article.rb

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

Unterkategorie.rb

declare association with categories here not articles (belongs_to / has_many_and_belongs_to)
milaziggy
quelle