[RUBY] À propos de l'erreur PG :: UndefinedTable: ERROR: la relation "XXXXXX" n'existe pas

Détails de l'erreur

Pour Deploy to heroku, exécutez "% git push heroku master" et Erreur lors de l'exécution de la commande suivante

Terminal


% heroku run rake db:migrate

L'erreur après l'exécution de la commande ci-dessus est la suivante

Terminal (partie de la déclaration d'erreur)


PG::UndefinedTable: ERROR: relation "XXXXXX" does not exist
#"XXXXXX"Nom de la table

Omis ci-dessous

Interprétation de l'énoncé d'erreur

Parce que le nom de la table intermédiaire a été inclus dans l'instruction d'erreur Il s'avère que c'est une erreur liée à la table.

Parce que cela fonctionnait bien localement Je pense que cette fois, il y a des erreurs qui ne peuvent être rencontrées que dans l'environnement de production.

Cause

J'ai commis une erreur dans l'ordre dans lequel les fichiers de migration ont été créés. (Phénomène dans le cas de herok)

Commentaire

Migrer avec herok (% heroku run rake db: migrate) Cela se fait dans l'ordre de la date de création.

"20200912095202_create_song_discs.rb" La première lettre du fichier de migration est déterminée par la date à laquelle il a été créé. (Il semble que cette partie soit la version.)

Cette fois, créez d'abord un fichier lié à la table intermédiaire (table song_discs), Plus tard, j'ai créé un fichier sur la table (table des disques) sur cette table. Ce sera une erreur causée par cela. Bref, je pense que la table intermédiaire peut être créée plus tard.

solution de contournement

(1) Supprimez le fichier de migration lié à la table intermédiaire car la date de création de la table intermédiaire sera ultérieure.

(2) Créez à nouveau une table intermédiaire lorsque la date de création d'une autre table liée à la table intermédiaire est antérieure en raison d'une suppression.

③ Migration locale à nouveau% rails db: migrer

④ Terminez le processus jusqu'au déploiement à nouveau! !!

Flux d'action (commande)

supposition

Il a été décrit dans le fichier de migration de la table intermédiaire. Puisque je travaille en touchant le fichier, je le copie (sauvegarde) dans un autre emplacement pour ne pas avoir à m'inquiéter si le contenu est perdu.    ❗️ Veuillez vous assurer de lire ❗️ En tant que processus pour changer l'ordre de création des fichiers Supprimez le fichier! Le contenu disparaîtra également! "Je veux utiliser la description dans le fichier telle quelle!" "Je ne veux pas changer le contenu!" À ce stade, veuillez copier la description dans le fichier (pour la sauvegarde) quelque part. Veuillez noter que le contenu sera détruit lorsque le fichier sera supprimé.

Vérifiez l'ordre dans lequel les fichiers de migration ont été créés

Vous pouvez vérifier l'historique avec cette commande

Terminal


% bundle exec rake db:migrate:status

Vérifiez l'ID de migration pour connaître la version Ils sont classés dans l'ordre dans lequel ils ont été créés.

Exemple


database:nom de l'application_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 Créer des disques de chansons ← La table intermédiaire est créée en premier.
   up     20200821160923  Create discs

Supprimer les fichiers de migration inutiles

Depuis que j'ai créé une table intermédiaire appelée song_discs pour la première fois cette fois Supprimé pour recréer le fichier.

Points à vérifier avant de supprimer le fichier de migration

Le statut du fichier que vous souhaitez supprimer doit être "down".

Exemple


database:nom de l'application_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

S'il est "down" comme dans l'exemple ci-dessus, procédez au travail de suppression tel quel S'il est «haut», changez-le en «bas» puis supprimez-le. ("VERSION = ID de migration du fichier que vous souhaitez supprimer" peut être supprimé)

Exemple de commande pour réduire l'état


% rails db:migrate:down VERSION=20200821150924

Effectuer une suppression de fichier de migration

Il peut être plus fiable de copier le nom du fichier de migration tel quel.

Terminal


% rm -rf db/migrate/Nom du fichier que vous souhaitez supprimer

Exemple


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

Vérifiez s'il a été supprimé

"% Bundle exec rake db: migrate: status" à nouveau S'il disparaît, la suppression est réussie

Exemple


database:nom de l'application_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

Créer une migration nouvellement supprimée

Exécutez la commande pour créer uniquement le fichier de migration.

Terminal


%rails g migration Le nom du fichier de migration que vous souhaitez créer

Exemple


% rails g migration create_song_discs     

Un exemple du fichier complété est "20200912095202_create_song_discs.rb" Attention à ne pas oublier d'insérer create!

Il est sûr de vérifier l'historique avec "% bundle exec rake db: migrate: status" ici.

Modifier le fichier de migration créé

Modifier si nécessaire avant la migration de la base de données (C'est le contenu décrit sur les lieux.)

Dans mon cas cette fois, le contenu est le même que dans le fichier supprimé, donc J'ai collé ce que j'ai copié et enregistré à l'avance.

Migrer vers la base de données

Étant donné que le statut ne peut pas rester "down", exécutez la commande suivante Changez pour "up".

 % rails db:migrate  

Aussi, je vais vérifier ici pour voir si cela fonctionne dans mon environnement local! Puisque je touche le fichier, je vais vérifier si quelque chose ne va pas et passer à l'étape suivante.

Déployez à nouveau sur heroku

Si vous arrivez à ce point, les contre-mesures sont terminées, donc Essayez de déployer! !!

Comment faites-vous? Si vous avez des questions, veuillez cliquer ici. (https://qiita.com/kusaharajiji/items/9287235d56843c03734c)!

Je vous remercie pour votre travail acharné! !! L'avez-vous déployé? Je suis très heureux de résoudre l'erreur!

point

Pour le déploiement heroku Faites attention à l'ordre dans lequel les fichiers de migration sont créés!

Un mot mémo

J'ai beaucoup appris cette fois. Si vous le faites avec désinvolture, vous trébucherez simplement comme si vous disiez: "Vous ne comprenez pas ici!" Merci pour l'erreur. Pendant que j'écrivais l'article, j'ai trouvé un nouveau manque de compréhension.

① À propos des «haut» et «bas» qui apparaissent dans l'historique des fichiers de migration (2) Concernant les règles de création de fichiers de migration (est-ce limité à heroku?)

Je suis curieux de savoir cela aussi, alors j'aimerais l'écrire à nouveau, alors je l'enregistrerai ici.

Aussi, proposez d'autres solutions, Lors de la création d'un fichier de migration, j'ai essayé de le supprimer en inversant la commande pour créer un modèle (% rails g nom du modèle du modèle) et réessayer, mais cela semblait difficile car il y avait des fichiers qui avaient été supprimés plus que nécessaire, alors j'ai arrêté. Ta! Vous devez savoir ce que la commande de suppression supprimera ~ (Bien sûr ... lol)

Veuillez lire jusqu'au bout Merci beaucoup! A bientôt: détendu :: wave:

Recommended Posts

À propos de l'erreur PG :: UndefinedTable: ERROR: la relation "XXXXXX" n'existe pas
"Erreur: le package xxx n'existe pas" "Erreur: symbole introuvable" lors de la réécriture de kotlin
Le package eclipse org.springframework.boot.web.servlet.support n'existe pas
opérateur n'existe pas: gestion de l'horodatage d'erreur sans fuseau horaire ~~ inconnu