2009-06-17 26 views
20

Czy rake db: migrate dodaje tylko nowe migracje, czy usuwa wszystkie migracje/zmiany i buduje wszystko nowe?co dokładnie robi rake db: migrate do?

Myślę, że prowizja generuje błąd, ponieważ próbuje uzyskać dostęp do atrybutu tabeli w migracji 040, który został usunięty podczas migracji 042. jakoś moje konto i prowizja nie są zsynchronizowane i chcę je naprawić.

dla was, ekspertów tam - czy powszechne jest, że prowizja nie jest zsynchronizowana z migracjami? jak mogę tego uniknąć (nie, nie edytuję ręcznie schematów lub plików rake'u).

Odpowiedz

14

Za każdym razem, gdy tworzysz migrację za pomocą skryptów (takich jak skrypt/generuj model ...), nowa migracja jest dodawana do właściwego katalogu, gotowego do zsynchronizowania z rzeczywistą bazą danych.

Właściwie prowizja db: migracja tylko sprawdza, które brakujące migracje wciąż muszą być zastosowane do bazy danych bez dbania o poprzednie.

Oczywiście jeśli modyfikujesz bazę danych innymi sposobami, możesz uzyskać niezsynchronizowane operacje, ponieważ, jak powiedziałeś, możesz zastosować migrację do czegoś, co zostało zmienione pod spodem.

21

Podczas korzystania z migracji railsowania automatycznie tworzona jest tabela o nazwie schema_migrations, która śledzi, jakie migracje zostały zastosowane, poprzez zapisanie numeru wersji każdej migracji (jest to liczba, która poprzedza nazwę migracji w nazwie pliku , tzn. db/migrate/_20090617111204__migration.rb). Po uruchomieniu rake db:migrate do migracji zostaną uruchomione tylko migracje, które nie zostały wcześniej uruchomione (tj. Ich wersja nie jest zawarta w tabeli) (z tego powodu zmiana już wykonanej migracji nie będzie miała żadnego wpływu podczas uruchamiania db:migrate). Podczas migracji wszystkie wersje znalezione w schema_migrations, które są większe niż wersja, do której cofasz, zostaną cofnięte.

+2

Dzięki Bogu ta odpowiedź była dla mnie bardziej szczegółowa. Dlaczego schema_migrations nie znajduje się w pliku db: migrate documentation? To był brakujący element mojego rozumienia systemu w odniesieniu do tego, w jaki sposób powstają "szyny", aby "określić, które migracje powinny zostać uruchomione"! –

5

Migracja oznacza przejście z bieżącej wersji do nowszej (zgodnie z pierwszą odpowiedzią). Używając rake db: migrate, możesz zastosować dowolne nowe zmiany w swoim schemacie. Ale jeśli chcesz przywrócić poprzednią migrację, możesz użyć polecenia rake db: rollback, aby anulować nowe zmiany, jeśli są one niepoprawnie zdefiniowane. Uwaga: w ten sposób Twoje dane zostaną utracone.

Powiązane problemy