Zgubiłem schema.rb! Czy można go zregenerować?

133

Z powodu problemów z wdrożeniem przestałem śledzić schema.rb w git. Jakoś to upchnąłem i gdzieś po drodze zniknął mój plik schema.rb.

Czy istnieje sposób na ponowne wygenerowanie pliku schema.rb z bazy danych lub z migracji? Wolałbym nie stracić istniejących danych.

ćwiek
źródło

Odpowiedzi:

230

Jeśli uruchomisz a rake -T, wyświetli się lista wszystkich możliwych zadań rake'u dla twojego projektu Rails. Jednym z nich jest db: schema: dump, który odtworzy plik schema.rb dla aplikacji Rails z bazy danych.

bundle exec rake db:schema:dump
mguymon
źródło
Wielkie dzięki, wiele odpowiedzi, ale wygląda na to, że byłeś pierwszy (tylko), więc zaznacz dla siebie. Ciekawe, czy to generuje schemat z samej bazy danych, czy z migracji?
brad
7
Z samej bazy danych, więc zachowaj ostrożność, jeśli nastąpiły zmiany poza migracjami.
mguymon
1
schema.rb nadal zawiera pusty schemat po rake db:schema:dumpna railsach 2.0
Will Hardwick-Smith
Mój plik schema.rb pozostaje dokładnie taki sam po uruchomieniu powyższych poleceń
stevec
59

Ostrożny,

rake db:schema:dump

zrzuci bieżący schemat DB Z DB . Oznacza to, że jeśli wprowadziłeś jakiekolwiek zmiany w swoich migracjach, NIE zostaną one odzwierciedlone w pliku schema.rb, który nie jest tym, czego chcesz IMO.

Jeśli chcesz ponownie utworzyć schemat na podstawie migracji, wykonaj następujące czynności:

rake db:drop  # ERASES THE DATABASE !!!! 
rake db:create
rake db:migrate
gamov
źródło
1
Doprowadziłoby to do utraty danych, których PO powiedział, że chcą uniknąć. Dodatkowo, jak podkreśla Colin, regeneracja bazy danych wyłącznie na podstawie migracji jest potencjalnie bardzo złym pomysłem ze względu na zwiększone prawdopodobieństwo wystąpienia dziwnych problemów z zależnościami (ogólnie rzecz biorąc). Jeśli istnieją oczekujące migracje, najlepiej byłoby uruchomić te ostatnie migracje na komputerze deweloperskim, a następnie uruchomić rake db:schema:dumppolecenie.
Paul Richter,
4
Każde płótno jest jasno wyjaśnione w mojej odpowiedzi. Zostałem DOKŁADNIE ugryziony, uruchamiając tylko schemat: dump i nie uzyskując czystego schematu. OP mówi o śledzeniu schematu w CVS. Chciałbym, aby mój schemat był zgodny z moimi definicjami w moich migracjach, a nie przestarzałą wersją z produkcyjnej bazy danych lub starej deweloperskiej bazy danych
gamov
11
rake db:schema:dump

Myślę, że jest to nadal ważne w Railsach 3 - regeneruje schema.rb z bazy danych.

pschuegr
źródło
8

KOLEJKI 5-drożne:

rails db:schema:dump

lub jeśli spotkasz Gem :: LoadError to:

bundle exec rails db:schema:dump

Uwaga:

w rails 5 zaleca się, aby zadania były generowane / wykonywane przy użyciu railszamiast rake, należy to pamiętać, zadania generowane przez railsy mają rozszerzenie .rakepatrz w lib/tasks/myTask.rake. co oznacza, że ​​zadanie to można również wykonać przez poprzedzanie rake.

Kaleem Ullah
źródło
5

Jeśli regenerujesz się schema.rblokalnie, powinno być dobrze. Po prostu zawiera reprezentację struktury tabel bazy danych. Same dane nie są zawarte w tym pliku.

Aby zregenerować schema.rbplik, uruchom:

bundle exec rake db:schema:dump

Następnie po prostu zatwierdź nowy schema.rbplik i powinieneś być w dobrej formie!

Graham Swan
źródło
4

Bezpośrednio z samego pliku schema.rb:

Jeśli chcesz utworzyć bazę danych aplikacji w innym systemie, powinieneś używać db:schema:load, a nie uruchamiać wszystkich migracji od zera. To drugie jest podejściem wadliwym i niezrównoważonym (im więcej migracji zgromadzisz, tym wolniej będzie działać i tym większe prawdopodobieństwo problemów).

Więc NIE rób sugestii rake db:migrate, która została zasugerowana w - w czasie tego pisania - najniżej ocenianej odpowiedzi.

Colin Summers
źródło
Prawdopodobnie chciałbyś uruchomić kilka ostatnich oczekujących migracji, jeśli są jakieś na twoim komputerze deweloperskim przed regeneracją schematu, ale tak, regeneracja bazy danych wyłącznie na podstawie migracji jest bardzo złym pomysłem, zwłaszcza że spowodowałoby to utratę danych.
Paul Richter,
1

Miałem również podobny problem, w którym mój stary schemat nie odświeżał się, nawet jeśli usunąłem migrację.

Więc porzuciłem wszystkie istniejące tabele w bazie danych i ponownie je zmigrowałem. Uruchomienie polecenia „db: schema: load” dało mi nowy plik schema.rb.

drop table my_table_name // deleted them individually
rake db:migrate
rake db:schema:dump // re-created a new schema
R.Cha
źródło