[RUBY] Über den Fehler PG :: UndefinedTable: ERROR: Die Beziehung "XXXXXX" existiert nicht

Fehlerdetails

Führen Sie für In Heroku bereitstellen "% git push heroku master" und aus Fehler beim Ausführen des folgenden Befehls

Terminal


% heroku run rake db:migrate

Der Fehler nach dem Ausführen des obigen Befehls ist wie folgt

Terminal (Teil der Fehleranweisung)


PG::UndefinedTable: ERROR: relation "XXXXXX" does not exist
#"XXXXXX"Tabellenname

Unten weggelassen

Interpretation der Fehlererklärung

Weil der Zwischentabellenname in der Fehleranweisung enthalten war Es stellt sich heraus, dass es sich um einen tabellenbezogenen Fehler handelt.

Weil es vor Ort gut funktioniert hat Ich denke, diesmal gibt es Fehler, die nur in der Produktionsumgebung auftreten können.

Ursache

Ich habe einen Fehler in der Reihenfolge gemacht, in der die Migrationsdateien erstellt wurden. (Phänomen im Fall von Herok)

Kommentar

Mit Herok migrieren (% heroku run rake db: migrieren) Dies erfolgt in der Reihenfolge des Erstellungsdatums.

"20200912095202_create_song_discs.rb" Der erste Buchstabe der Migrationsdatei wird durch das Erstellungsdatum bestimmt. (Es scheint, dass dieser Teil die Version ist.)

Erstellen Sie dieses Mal zuerst eine Datei, die sich auf die Zwischentabelle bezieht (song_discs-Tabelle). Später habe ich eine Datei über die Tabelle (Discs-Tabelle) über diese Tabelle erstellt. Dies ist ein Fehler. Kurz gesagt, ich denke, die Zwischentabelle kann später erstellt werden.

Problemumgehung

(1) Löschen Sie die Migrationsdatei für die Zwischentabelle, da das Erstellungsdatum der Zwischentabelle später liegt.

(2) Erstellen Sie eine Zwischentabelle erneut, wenn das Erstellungsdatum einer anderen Tabelle, die sich auf die Zwischentabelle bezieht, aufgrund des Löschens früher liegt.

③ Wieder lokale Migration% Rails DB: Migrieren

④ Schließen Sie den Vorgang bis zur Bereitstellung erneut ab! !!

Aktionsablauf (Befehl)

Annahme

Es wurde in der Migrationsdatei der Zwischentabelle beschrieben. Da ich durch Berühren der Datei arbeite, kopiere ich sie an einen anderen Speicherort, damit ich mir keine Sorgen machen muss, wenn der Inhalt verloren geht.    ❗️ Bitte lesen Sie unbedingt ❗️ Als Prozess zum Ändern der Reihenfolge der Dateierstellung Datei löschen! Der Inhalt wird auch verschwinden! "Ich möchte die Beschreibung in der Datei so verwenden, wie sie ist!" "Ich möchte den Inhalt nicht ändern!" Zu diesem Zeitpunkt kopieren Sie bitte die Beschreibung in die Datei (zur Sicherung) irgendwo hin. Bitte beachten Sie, dass der Inhalt beim Löschen der Datei zerstört wird.

Überprüfen Sie die Reihenfolge, in der die Migrationsdateien erstellt wurden

Mit diesem Befehl können Sie den Verlauf überprüfen

Terminal


% bundle exec rake db:migrate:status

Überprüfen Sie die Migrations-ID, um die Version herauszufinden Sie sind in der Reihenfolge angeordnet, in der sie erstellt wurden.

Beispiel


database:App Name_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200723033017  Devise create users
   up     20200727050028  Create songs
   up     20200731024511  Create user songs
   up     20200801063906  Create songcolors
down 20200821150924 Song-Discs erstellen ← Die Zwischentabelle wird zuerst erstellt.
   up     20200821160923  Create discs

Löschen Sie nicht benötigte Migrationsdateien

Da ich diesmal zuerst eine Zwischentabelle namens song_discs erstellt habe Gelöscht, um die Datei neu zu erstellen.

Dinge, die vor dem Löschen der Migrationsdatei überprüft werden müssen

Der Status der Datei, die Sie löschen möchten, muss "down" sein.

Beispiel


database:App Name_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200723033017  Devise create users
   up     20200727050028  Create songs
   up     20200731024511  Create user songs
   up     20200801063906  Create songcolors
  down    20200821150924  Create song discs
   up     20200821160923  Create discs

Wenn es wie im obigen Beispiel "down" ist, fahren Sie mit der Löscharbeit fort, wie sie ist Wenn es "oben" ist, ändern Sie es in "unten" und löschen Sie es dann. ("VERSION = Migrations-ID der Datei, die Sie löschen möchten" kann gelöscht werden.)

Beispielbefehl zum Herunterfahren des Status


% rails db:migrate:down VERSION=20200821150924

Löschen einer Migrationsdatei durchführen

Es ist möglicherweise zuverlässiger, den Namen der Migrationsdatei so zu kopieren, wie er ist.

Terminal


% rm -rf db/migrate/Dateiname, den Sie löschen möchten

Beispiel


% rm -rf db/migrate/20200821150924_create_song_discs.rb

Überprüfen Sie, ob es gelöscht wurde

"% Bundle exec rake db: migrate: status" erneut Wenn es verschwindet, ist das Löschen erfolgreich

Beispiel


database:App Name_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200723033017  Devise create users
   up     20200727050028  Create songs
   up     20200731024511  Create user songs
   up     20200801063906  Create songcolors
   up     20200821160923  Create discs

Erstellen Sie eine neu gelöschte Migration

Führen Sie den Befehl aus, um nur die Migrationsdatei zu erstellen.

Terminal


%Rails g Migration Der Name der Migrationsdatei, die Sie erstellen möchten

Beispiel


% rails g migration create_song_discs     

Ein Beispiel für die fertige Datei ist "20200912095202_create_song_discs.rb". Vergessen Sie nicht, create einzufügen!

Es ist sicher, den Verlauf mit "% bundle exec rake db: migrate: status" hier zu überprüfen.

Bearbeiten Sie die erstellte Migrationsdatei

Bearbeiten Sie sie gegebenenfalls vor der Datenbankmigration (Dies ist der in der Prämisse beschriebene Inhalt.)

In meinem Fall ist der Inhalt diesmal der gleiche wie in der gelöschten Datei Ich habe das, was ich kopiert und im Voraus gespeichert habe, eingefügt.

Zur Datenbank migrieren

Da der Status nicht "down" bleiben kann, führen Sie den folgenden Befehl aus Wechseln Sie zu "up".

 % rails db:migrate  

Außerdem werde ich hier überprüfen, ob es in meiner lokalen Umgebung funktioniert! Da ich die Datei berühre, überprüfe ich, ob etwas nicht stimmt, und fahre mit dem nächsten Schritt fort.

Erneut auf Heroku bereitstellen

Zu diesem Zeitpunkt sind die Gegenmaßnahmen abgeschlossen Versuchen Sie es mit der Bereitstellung! !!

Wie machst du das? Wenn Sie Fragen haben, klicken Sie bitte hier. (https://qiita.com/kusaharajiji/items/9287235d56843c03734c)!

Danke für deine harte Arbeit! !! Haben Sie es bereitgestellt? Ich bin sehr glücklich, den Fehler zu beheben!

Punkt

Für den Heroku-Einsatz Achten Sie auf die Reihenfolge der Erstellung von Migrationsdateien!

Ein Wort Memo

Diesmal habe ich viel gelernt. Wenn Sie es beiläufig machen, werden Sie nur stolpern, als ob Sie sagen würden: "Sie verstehen hier nicht!" Vielen Dank für den Fehler. Als ich den Artikel schrieb, stellte ich einen neuen Mangel an Verständnis fest.

① Informationen zu "Auf" und "Ab", die im Verlauf der Migrationsdateien angezeigt werden (2) Bezüglich der Regeln zum Erstellen von Migrationsdateien (ist dies auf Heroku beschränkt?)

Ich bin auch neugierig darauf, also würde ich es gerne noch einmal schreiben, also werde ich es hier aufnehmen.

Überlegen Sie sich auch andere Lösungen: Beim Erstellen einer Migrationsdatei habe ich versucht, sie zu löschen, indem ich den Befehl zum Erstellen eines Modells (% Rails g Modellmodellname) umgekehrt und erneut versucht habe. Dies schien jedoch schwierig zu sein, da Dateien mehr als erforderlich gelöscht wurden. Daher habe ich aufgehört. Ta! Sie müssen wissen, was der Löschbefehl ~ löschen wird (Natürlich lol)

Bitte lesen Sie bis zum Ende Vielen Dank! Wir sehen uns wieder: entspannt :: Welle:

Recommended Posts

Über den Fehler PG :: UndefinedTable: ERROR: Die Beziehung "XXXXXX" existiert nicht
"Fehler: Paket xxx existiert nicht" "Fehler: Symbol nicht gefunden" beim Umschreiben von Kotlin
Das Eclipse-Paket org.springframework.boot.web.servlet.support ist nicht vorhanden
Operator existiert nicht: Behandlung des Fehlerzeitstempels ohne Zeitzone ~~ unbekannt