À propos de l'erreur survenue lors de l'ajout d'un nom de colonne dans les rails (rails db: migrate, rails db: rollback, add)

table des matières

  1. Vue d'ensemble
  2. Cause
  3. Solution
  4. Réflexion
  5. Résumé

1. Vue d'ensemble

Il y a deux tables, la table Items et la table Users, et pour ajouter la colonne user-id à la table Items créée en premier, j'ai exécuté rails db: rollback deux fois, puis j'ai exécuté rails db: migrate Cependant, j'ai eu une erreur indiquant que la clé externe n'existe pas et que l'utilisateur SQL n'existe pas. (À l'origine, j'aurais dû ajouter une colonne en utilisant add.)

2. Cause

Avant de créer la table Users, la table Items a été créée provisoirement, donc une erreur s'est produite: l'ID utilisateur associé à la table Item n'existe pas.

Par exemple, supposons que vous ayez créé la première table Items ** à partir du 1er septembre **.

class CreateItems < ActiveRecord::Migration[6.0]
  def change
    create_table :items do |t|
      t.references :user,         foreign_key: true
Ceci est lié à la cause de l'erreur
      t.string :name,             null: false
      t.timestamps
    end
  end
Omis ci-dessous

Supposons que vous ayez créé la deuxième table Users ** à compter du 5 septembre **.

class DeviseCreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :name,                        null: false
      t.string :email,                       null: false, default: ""
      t.string :encrypted_password,          null: false, default: ""
Ce qui suit est omis

Je pense que le fichier de base de données ressemblera à db / migrate / 20200905052006_devise_create_users.rb, mais la partie numérique "20200905052006" indique la date et l'heure de création de la base de données.

rails db: migrate migrera les bases de données une par une dans l'ordre à partir de la date et de l'heure les plus anciennes, donc dans ce cas, la base de données de la table Items créée le 1er septembre sera migrée en premier. ..

En d'autres termes, si vous essayez de migrer la table Items alors que la table Users n'a pas été migrée, t.references: user, Foreign_key: true n'est pas considéré comme valide et il n'y a pas de clé externe pour l'utilisateur. Je reçois un message d'erreur indiquant qu'il n'y a pas de SQL.

3. Solution

Si vous renommez le nombre dans la partie date et heure, enregistrez le fichier pour que la série chronologique soit inversée, puis effectuez rails db: migrate, la table Users est migrée en premier et la clé externe n'existe pas, l'utilisateur L'erreur selon laquelle SQL n'existe pas est résolue.

4. Réflexion

  1. Je n'ai pas pu publier de message d'erreur précis car je n'ai pas gardé un bon enregistrement de l'erreur. Je prendrai des notes avec un sentiment de tension tout en étant conscient de l'affichage.

  2. En premier lieu, si la colonne était ajoutée à l'aide de add, la série chronologique serait incorrecte et aucune erreur ne se produirait. S'il avait été configuré pour ajouter, il aurait dû être possible de migrer uniquement la colonne usser-id de la table Items après la migration de la table User. C'était une erreur de faire deux fois rails db: rollback et de changer directement les noms de colonne dans la table Items.

5. Résumé

  1. Il est préférable d'utiliser ajouter pour ajouter des colonnes. Surtout lors de l'ajout d'une clé externe, rails db: migrate peut provoquer une erreur.
  2. La partie numérique du fichier de base de données indique la date et l'heure de création.
  3. rails db: migrate est exécuté dans l'ordre à partir de la date et de l'heure les plus anciennes. (Rails db: rollback annule la dernière migration.)
  4. Si vous ajoutez une colonne sans utiliser add et que vous obtenez une erreur indiquant que la clé externe n'existe pas, modifiez la date et l'heure du nom du fichier de base de données pour votre convenance.

Recommended Posts

À propos de l'erreur survenue lors de l'ajout d'un nom de colonne dans les rails (rails db: migrate, rails db: rollback, add)
[Rails] Que faire lorsque l'erreur Aucune base de données sélectionnée et Base de données inconnue apparaît dans db: migrate
[Rails] À propos de l'erreur selon laquelle l'image n'est pas affichée dans l'environnement de production
Que faire lorsqu'une erreur se produit dans les rails db: migrate ((StandardError: Une erreur s'est produite, cette migration et toutes les migrations ultérieures annulées :))
[Tutoriel Rails Chapitre 2] Que faire lorsque vous faites une erreur dans le nom de la colonne
Que faire si vous obtenez une erreur (StandardError: Une erreur s'est produite, cette migration et toutes les migrations ultérieures ont été annulées :) dans rails db: migrate
Erreur PG :: DatatypeMismatch lors de l'exécution de heroku run rails db: migrate
[Docker] Une histoire sur une erreur dans la composition de docker
[Rails] Erreur survenue lors du déploiement automatique par Capistrano (fatal: nom d'objet non valide: maître)
L'histoire que j'ai eu du mal parce que je ne pouvais pas faire "Rails db: migrate".
À propos du symbole <%%> dans Rails erb
[Rails] Modifier le fichier de migration (rails db: rollback)
Résolution d'une erreur survenue lors de la tentative d'utilisation de Spark dans un environnement où Java 8 et Java 11 coexistent
[Rails] J'ai découvert les fichiers de migration! (Ajout d'une colonne au tableau)
Comment référencer une colonne lors du remplacement de la méthode de nom de colonne dans ActiveRecord
[Rails] Modifier le fichier de migration (rails db: rollback STEP =)
Solution qui donne une erreur lors de la tentative de connexion à DB (MySQL) avec Java
Quand j'ai pensé à l'erreur 402 qui est apparue soudainement au milieu de l'introduction de PAY.jp, il y avait un endroit inattendu
Erreur lors de l'installation de l'ensemble lors de l'exécution de rails neufs
Quand tu te perds dans le nom de la classe
[Rails] Solution lorsqu'une erreur de migration se produit dans agit-as-taggable-on
Un mémorandum d'erreur survenu lors de la création d'un environnement CI / CD [Rails + CircleCI + Capistrano + AWS]