Wie verfolgt Rails, welche Migrationen für eine Datenbank ausgeführt wurden?

93

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

"Active Record verfolgt, welche Migrationen bereits ausgeführt wurden. Sie müssen also nur Ihre Quelle aktualisieren und rake db: migrate ausführen."

Wie macht ActiveRecord das eigentlich? Wo speichert Active Record die Daten?

Ich vermute, dass dies in der Datenbank selbst gespeichert sein könnte? Irgendwo in einem Tisch.

Auf meinem Entwicklungscomputer habe ich alle Migrationen ausgeführt. Dann habe ich die Produktionsdatenbank mit mysqldump kopiert. Dann habe ich "rake db: migrate: status" ausgeführt. Es zeigt korrekt die Migrationen an, die in der Produktionsdatenbank ausgeführt werden müssen.

Früher dachte ich, dass ActiveRecord den letzten Migrationslauf mithilfe des Zeitstempels verfolgt. Ich denke jedoch, dass dies nicht der Fall ist, da ActiveRecord die "älteren" Migrationen, die aus einem anderen Codezweig zusammengeführt wurden, korrekt ausführt.

Könnte jemand mit Insiderwissen darüber aufwändig sein? Vielen Dank

Zack Xu
quelle
1
Ich glaube, es gibt eine Tabelle in der Datenbank, die den Überblick behält.
Jack Franklin

Antworten:

166

Rails erstellt eine Tabelle in Ihrer Datenbank, die aufgerufen wird schema_migrations, um zu verfolgen, welche Migrationen ausgeführt wurden.

Die Tabelle enthält eine einzelne Spalte version. Wenn Rails eine Migration ausführt, werden die führenden Ziffern im Dateinamen der Migration verwendet und eine Zeile für diese "Version" eingefügt, die angibt, dass sie ausgeführt wurde. Wenn Sie diese Migration zurücksetzen, löscht Rails die entsprechende Zeile aus schema_migrations.

Wenn Sie beispielsweise eine Migrationsdatei mit dem Namen 20120620193144_create_users.rbausführen, wird eine neue Zeile mit einer Version von 20120620193144in die schema_migrationsTabelle eingefügt.

Sie können jederzeit Migrationen mit früheren Versionen einführen. Rails führt immer alle neuen Migrationen aus, für die es keine entsprechende Zeile gibt schema_migrations. Die führenden Ziffern müssen kein Zeitstempel sein, Sie können Ihre Migration aufrufen 001_blah.rb. Frühere Versionen von Rails verwendeten dieses Format und verwendeten die fortlaufende Nummerierung für neu generierte Migrationen. Spätere Versionen haben auf Zeitstempel umgestellt, um zu verhindern, dass mehrere Entwickler unabhängig voneinander Migrationen mit derselben Nummer generieren.

meagar
quelle
Besonders nützlich, wenn Sie eine Mischung aus einem montierbaren Motor und einer Dummy-App verwenden
Donato