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!
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.
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!
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
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!
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!
Il existe deux façons d'ajouter des colonnes à une table existante.
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
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
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