W jaki sposób Railsy śledzą, które migracje zostały uruchomione dla bazy danych?

94

Według dokumentu Rails: http://guides.rubyonrails.org/migrations.html

„Moduł Active Record śledzi, które migracje zostały już uruchomione, więc wszystko, co musisz zrobić, to zaktualizować źródło i uruchomić rake db: migrate”.

Jak właściwie to robi ActiveRecord? Gdzie Active Record przechowuje dane?

Podejrzewam, że to może być zapisane w samej bazie danych? Gdzieś w stole.

Na moim komputerze programistycznym przeprowadziłem wszystkie migracje. Następnie skopiowałem produkcyjną bazę danych za pomocą mysqldump. Następnie uruchomiłem "rake db: migrate: status", który poprawnie pokazuje migracje, które należy uruchomić na produkcyjnej bazie danych.

Kiedyś myślałem, że ActiveRecord śledzi ostatni przebieg migracji przy użyciu znacznika czasu. Ale myślę, że to nieprawda, ponieważ ActiveRecord poprawnie uruchamia „starsze” migracje scalone z innej gałęzi kodu.

Czy mógłby ktoś z wewnętrzną wiedzą na ten temat? Dzięki

Zack Xu
źródło
1
Myślę, że w bazie danych znajduje się tabela, która śledzi.
Jack Franklin,

Odpowiedzi:

167

Railsy tworzą w Twojej bazie danych tabelę o nazwie schema_migrations aby śledzić, które migracje zostały uruchomione.

Tabela zawiera pojedynczą kolumnę version. Kiedy Railsy uruchamiają migrację, pobiera pierwsze cyfry w nazwie pliku migracji i wstawia wiersz dla tej „wersji”, wskazując, że została uruchomiona. Jeśli cofniesz migrację, Railsy usuną odpowiedni wiersz z schema_migrations.

Na przykład uruchomienie pliku migracji o nazwie 20120620193144_create_users.rbspowoduje wstawienie 20120620193144do schema_migrationstabeli nowego wiersza z wersją programu .

W dowolnym momencie możesz wprowadzić migracje we wcześniejszych wersjach. Railsy zawsze będą uruchamiać nowe migracje, dla których nie ma odpowiedniego wiersza schema_migrations. Początkowe cyfry nie muszą być sygnaturą czasową, możesz nazwać migrację 001_blah.rb. Wcześniejsze wersje Railsów używały tego formatu i używały numeracji sekwencyjnej dla nowo generowanych migracji. Późniejsze wersje przeszły na sygnatury czasowe, aby uniemożliwić wielu programistom niezależne generowanie migracji o tym samym numerze.

meagar
źródło
Szczególnie przydatny, gdy używasz połączenia montowanego silnika i fałszywej aplikacji
Donato