[RUBY] [Rails] J'ai découvert les fichiers de migration! (Ajout d'une colonne au tableau)

introduction

Alors que je travaillais avec Rails, j'ai remarqué qu'il y avait de nombreux fichiers et commandes dont je savais l'existence, mais je ne comprenais pas très bien ce qu'ils faisaient. L'un d'eux est le fichier de migration.

Lorsque je crée un modèle, je ne sais pas pourquoi un fichier de migration est créé, et lorsque je tape rails db: migrate, il est reflété sous forme de données de table dans schema.rb`` ... C'était la reconnaissance, mais je vais creuser plus profondément et l'expliquer!

Qu'est-ce qu'un fichier de migration?

Le fichier de migration est un dessin de conception lors de la génération de la base de données. De plus, en exécutant le fichier de migration, une table de données basée sur le contenu décrit sera générée.

Générer un fichier de migration

Lorsque vous créez un modèle en tapant ce qui suit dans le terminal, un fichier de migration sera également généré automatiquement.

Syntaxe de base


rails g nom du modèle du modèle#Ici, le nom du modèle est "livre"

db/migrate/20201114044025_create_books.rb


class CreateBooks < ActiveRecord::Migration[5.2]
  def change
    create_table :books do |t|
      t.timestamps
    end
  end
end

Dans l'état initial lorsque le fichier de migration est terminé, vous pouvez voir que seul t.timestamps '' est répertorié par défaut. Cela ajoutera created_at '', qui signifie la date et l'heure de création, et `` updated_at '', qui signifie la date et l'heure de mise à jour, à la colonne.

Maintenant, exécutons le fichier de migration que nous avons créé! J'ai l'impression qu'il n'y a pas assez de colonnes dont j'ai réellement besoin, mais j'ose la garder telle quelle!

Exécutez le fichier de migration

Le fichier de migration créé sera lu en tapant la commande suivante dans le terminal et reflété dans la base de données.

commander


rails db:migrate

Vérifiez l'état du fichier de migration

Cette fois, j'ai créé un seul fichier de migration. Je pense que vous pouvez créer plusieurs modèles en même temps (ou plutôt, je pense qu'il y en a plus). Dans ce cas, si vous souhaitez vérifier dans quelle mesure le fichier de migration que vous avez créé est exécuté, saisissez la commande suivante dans le terminal.

commander


rails db:migrate:status

Ensuite, l'état actuel du fichier de migration sera affiché sur le terminal.

Terminal


Status   Migration ID    Migration Name
--------------------------------------------------
  up     20201114044025   Create books

Le fichier de migration en cours d'exécution est déjà exécuté, il ne sera donc pas lu même si vous entrez la commande rails db: migrate. Donc, si vous éditez un fichier de migration qui est `` up '' lorsque vous créez une colonne avec le mauvais nom, il ne sera pas lu et n'aura aucun sens.

Référence: [Rails] Explication approfondie des fichiers de migration!

Eh bien, que faire si vous souhaitez ajouter une nouvelle colonne à la table des livres que vous venez de créer? Vérifions le fichier de schéma pour le moment!

Qu'est-ce qu'un fichier de schéma?

Lorsque la migration est exécutée, un fichier appelé `` schema.rb '' sera créé dans le dossier db. Jetons un coup d'œil au contenu immédiatement.

db/schema.rb


ActiveRecord::Schema.define(version: 2020_11_14_044025) do
  create_table "books", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
end

Il semble que la table a été créée avec succès. La description force :: cascade '' permet de recharger le schéma si la clé externe est correcte. Ajoutons maintenant une colonne appelée titre '' ici!

Comment ajouter une colonne

Il existe deux façons d'ajouter des colonnes à une table existante.

  1. Créez un nouveau fichier de migration et ajoutez des colonnes
  2. Ajoutez une colonne avec `` rails db: rollback ''

① Créez un fichier de migration pour ajouter des colonnes

Dans ce cas, entrez la commande suivante dans le terminal

commander


rails g migration Ajouter le nom de la colonne à ajouter Au nom de la table pour ajouter le nom de la colonne à ajouter:Moule

Dans ce cas, cela ressemble à ceci:

Terminal


rails g migration AddTitleToBooks title:string

Ensuite, le fichier de migration suivant sera créé.

Fichier de migration


class AddTitleToBooks < ActiveRecord::Migration[5.2]
  def change
    add_column :books, :title, :string
  end
end

Après cela, exécutez le fichier de migration et la colonne `` titre '' sera ajoutée au tableau.

commander


rails db:migrate

② Ajouter une colonne avec `` rails db: rollback ''

commander


rails db:migrate:rollback

La saisie de cette commande dans le terminal rétablit la dernière version du fichier de migration à ce qu'elle était avant `` rails db: migrate ''. Dans ce cas, l'affichage du terminal change comme suit.

Terminal


Status   Migration ID    Migration Name
--------------------------------------------------
 down   20201114044025    Create books  #Ça va de haut en bas! !! !! !!

En d'autres termes, passer de haut '' à bas '' ramènera la base de données à ce qu'elle était avant rails db: migrate. Puisque nous sommes revenus à avant db: migrate, nous pouvons ajouter la colonne `` title '' au fichier de migration créé en premier.

db/migrate/20201114044025_create_books.rb


class CreateGenres < ActiveRecord::Migration[5.2]
  def change
    create_table :books do |t|
      t.string :title    #Ajoutez une colonne de titre ici! !! !! !!
      t.timestamps
    end
  end
end

Après cela, si vous exécutez le fichier de migration comme dans le modèle (1), la colonne `` titre '' sera ajoutée.

commander


rails db:migrate

db/schema.rb


ActiveRecord::Schema.define(version: 2020_11_14_044025) do
  create_table "books", force: :cascade do |t|
    t.string "title"  #Une colonne de titre a été ajoutée! !! !! !!
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
end

en conclusion

Le travail de modification du fichier de migration est souvent plus délicat que ce à quoi je m'attendais, alors j'ai réalisé à nouveau que je devais travailler dessus avec une solide compréhension du timing et de l'ordre. J'ai encore appris une chose! !!

Recommended Posts

[Rails] J'ai découvert les fichiers de migration! (Ajout d'une colonne au tableau)
[Rails] Traitement après l'ajout d'une colonne à la table de devise
[Rails] À propos des fichiers de migration
[Rails] Comment créer une table, ajouter une colonne et changer le type de colonne
[Rails] J'ai étudié la différence entre les ressources et les ressources
[Rails] Comment changer le nom de colonne de la table
Je souhaite créer un formulaire pour sélectionner la catégorie [Rails]
À propos de la langue à apprendre à partir de maintenant
Fichier de migration pour ajouter un commentaire à la table Rails
Lorsque vous souhaitez ajouter une colonne de type chaîne avec une longueur limitée avec la commande `rails generate migration`
[Note personnelle] J'ai appris à la légère sur les modificateurs
Notez que Junit 4 a été ajouté à Android Studio
[Rails] J'ai essayé de faire passer la version de Rails de 5.0 à 5.2
J'ai essayé d'organiser la session en Rails
[Rails] J'ai appris les types de types de données de base de données!
Code utilisé pour connecter Rails 3 à PostgreSQL 10
Comment créer une combinaison unique de données dans la table intermédiaire des rails
Un mémo sur le flux de Rails et Vue
Rails "Comment supprimer les fichiers de migration NO FILE"
[Rails] Je souhaite afficher la destination du lien de link_to dans un onglet séparé
Tokoro j'ai réécrit dans la migration de Wicket 7 à 8
[Ruby on Rails] Comment changer le nom de la colonne
Je veux utiliser une petite icône dans Rails
[Rails] Je ne sais pas comment utiliser le modèle ...
Je souhaite définir une fonction dans la console Rails
Une histoire sur l'effort de décompiler les fichiers JAR
Un mémorandum sur les types de données de table et les commandes (Rails)
Je souhaite ajouter une fonction de suppression à la fonction de commentaire
À propos de l'erreur survenue lors de l'ajout d'un nom de colonne dans les rails (rails db: migrate, rails db: rollback, add)
[Tutoriel Rails Chapitre 2] Que faire lorsque vous faites une erreur dans le nom de la colonne
[Rails 6.0, Docker] J'ai essayé de résumer la construction de l'environnement Docker et les commandes nécessaires pour créer un portfolio
[Débutant] Je souhaite modifier le fichier de migration-Comment utiliser la restauration-
J'ai essayé d'ajouter une ligne de séparation à TabLayout sur Android
[Rails] [bootstrap] Je souhaite modifier la taille de la police de manière réactive
Comment écrire une migration du type Rails datetime au type date
[Rails] J'ai essayé de créer une mini application avec FullCalendar
Je veux appeler une méthode et compter le nombre
Une note sur la fonction de départ de Ruby on Rails
Je veux donner un nom de classe à l'attribut select
[Ruby] Je souhaite inverser l'ordre de la table de hachage
[Controller] Je veux récupérer la valeur numérique d'une colonne spécifique de la base de données (mon mémo)
Comment gérer le type auquel j'ai pensé en écrivant un programme Java pendant 2 ans
Remarques sur la portée
[Rails] Ajouter une colonne à concevoir
À propos de l'ajout d'une fonction similaire
[Rails] Supprimer le fichier de migration
Comment restaurer le fichier de migration
Ce que j'ai appris sur Kotlin
Je souhaite rechercher de manière récursive des fichiers dans un répertoire spécifique