web-dev-qa-db-fra.com

Comment Rails conserve-t-il une trace des migrations exécutées pour une base de données?

Selon Rails doc: http://guides.rubyonrails.org/migrations.html

"Active Record suit les migrations qui ont déjà été exécutées. Il vous suffit donc de mettre à jour votre source et d'exécuter rake db: migrate."

Comment ActiveRecord fait-il cela? Où Active Record stocke-t-il les données?

Je soupçonne que cela pourrait être stocké dans la base de données elle-même? Dans une table quelque part.

Sur ma machine de développement, j'ai exécuté toutes les migrations. Ensuite, j'ai copié la base de données de production à l'aide de mysqldump. Ensuite, j'ai exécuté "rake db: migrate: status", il montre correctement les migrations qui doivent s'exécuter sur la base de données de production.

Je pensais qu'ActiveRecord garde une trace de la dernière migration effectuée à l'aide de l'horodatage. Mais je pense que ce n'est pas vrai car ActiveRecord exécute correctement les migrations "plus anciennes" fusionnées à partir d'une autre branche de code.

Quelqu'un pourrait-il avoir une connaissance intérieure de ce sujet? Merci

86
Zack Xu

Rails crée une table dans votre base de données appelée schema_migrations Pour garder une trace des migrations qui ont été exécutées.

Le tableau contient une seule colonne, version. Lorsque Rails exécute une migration, il prend les premiers chiffres du nom de fichier de la migration et insère une ligne pour cette "version", indiquant qu'elle a été exécutée. Si vous annulez cette migration, Rails supprimera la ligne correspondante de schema_migrations.

Par exemple, l'exécution d'un fichier de migration nommé 20120620193144_create_users.rb Insérera une nouvelle ligne avec une version de 20120620193144 Dans la table schema_migrations.

Vous êtes libre à tout moment d'introduire des migrations avec des versions antérieures. Rails exécutera toujours toutes les nouvelles migrations pour lesquelles il n'y a pas de ligne correspondante dans schema_migrations. Les premiers chiffres ne doivent pas nécessairement être un horodatage, vous pouvez appeler votre migration 001_blah.rb. Les versions antérieures de Rails utilisaient ce format et utilisaient une numérotation séquentielle pour les migrations nouvellement générées. Les versions ultérieures sont passées à des horodatages pour empêcher plusieurs développeurs de générer indépendamment des migrations avec le même numéro.

154
meagar