Comment Rails assure-t-il le suivi des migrations exécutées pour une base de données?

93

D'après le document Rails: http://guides.rubyonrails.org/migrations.html

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

Comment ActiveRecord fait-il réellement 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 en utilisant mysqldump. Ensuite, j'ai lancé "rake db: migrate: status", il montre correctement les migrations qui doivent s'exécuter sur la base de données de production.

J'avais l'habitude de penser qu'ActiveRecord garde une trace de la dernière migration exécutée en utilisant 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 avec une connaissance interne de cela pourrait-il élaborer? Merci

Zack Xu
la source
1
Il a une table dans la base de données qui assure le suivi, je crois.
Jack Franklin

Réponses:

166

Rails crée une table dans votre base de données appelée schema_migrations pour suivre les migrations exécutées.

La table 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 deschema_migrations .

Par exemple, l'exécution d'un fichier de migration nommé 20120620193144_create_users.rbinsérera une nouvelle ligne avec une version de 20120620193144dans leschema_migrations table.

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 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 aux horodatages pour empêcher plusieurs développeurs de générer indépendamment des migrations avec le même numéro.

maigre
la source
Particulièrement utile lorsque vous utilisez un mélange d'un moteur montable et d'une application factice
Donato