Wyczyść lub ponownie utwórz bazę danych Ruby on Rails

582

Mam bazę danych deweloperów Ruby on Rails pełną danych. Chcę usunąć wszystko i odbudować bazę danych. Myślę o użyciu czegoś takiego:

rake db:recreate

czy to możliwe?

Uczeń
źródło
Sugerowałbym, aby spojrzeć w przeszłość na najwyżej ocenioną odpowiedź. Moim zdaniem rake db:drop db:create db:schema:loadmoże być bardziej odpowiednie niż rake db:drop db:create db:migrate(chociaż jestem gotowy się mylić w tej sprawie).
Jason Swett
Możliwy duplikat Zresetuj bazę danych (
wyczyść
2
rake db:drop db:create db:migrate
William Hampshire
db:drop + db:create + db:migrate == db:migrate:reset. Zwykle uciekam się db:schema:load, gdy migracje są przerywane. Rzadko muszę odtwarzać bazę danych, więc szybkość nie ma większego znaczenia. Ponadto, jeśli masz niestosowane migracje db:schema:loadi db:resetnie zastosujesz ich. Nie jestem pewien, czy to duży argument.
x-yuri

Odpowiedzi:

1074

Znam dwa sposoby, aby to zrobić:

Spowoduje to zresetowanie bazy danych i ponowne załadowanie bieżącego schematu ze wszystkimi:

rake db:reset db:migrate

Spowoduje to zniszczenie bazy danych, a następnie utworzenie jej i migrację bieżącego schematu:

rake db:drop db:create db:migrate

Wszystkie dane zostaną utracone w obu scenariuszach.

thenengah
źródło
36
Wydaje się, że rake db:reseturuchamia także wszystkie migracje (przynajmniej na Rails 3), więc to powinno być wszystko, co jest potrzebne, prawda?
Plindberg
1
Lub raczej pozostawia schemat identyczny z tym, co uruchomiłyby wszystkie migracje. Ale migracje nie są uruchamiane per se (więc jeśli masz migracje, które wstawiają dane, tak się nie stanie; w tym celu powinieneś naprawdę użyć pliku db / seeds.rb).
Plindberg
1
Wiem, że dla aplikacji Tracks GTD db: migracja nie działała. Musiałem zrobić db: reset przy przejściu z Sqlite3 do Postgres.
labirynt
11
Musisz także uruchomić rake db:test:preparetestowanie, w przeciwnym razie pojawi się błąd:Could not find table 'things' (ActiveRecord::StatementInvalid)
s2t2
31
Ktoś powinien to wyjaśnić rake db:reseti rake db:drop db:create db:migrate zrobić dwie różne rzeczy . Ten ostatni usuwa całą bazę danych aplikacji, odtwarza ją, a następnie przechodzi każdą migrację, aby zaktualizować schemat ( db/schema.rblub db/structure.sql), ale nie wypełnia go danymi źródłowymi. Pierwszy zamiast tego jest aliasem dla rake db:drop db:schema:load db:seed, więc usuwa całą bazę danych aplikacji, ale nie aktualizuje schematu , a następnie zapełnia danymi źródłowymi. Jeśli więc nic nie zmieniłeś w swoich migracjach, pierwsza jest szybsza, druga bezpieczniejsza.
Claudio Floreani,
157

W Railsach 4 wszystko jest potrzebne

$ rake db:schema:load

Spowodowałoby to usunięcie całej zawartości bazy danych i odtworzenie schematu z pliku schema.rb bez konieczności stosowania wszystkich migracji jeden po drugim.

Eneko Alonso
źródło
6
działa również na szynach 3. przydatne, gdy po prostu pomieszałeś testową bazę danych i chcesz zresetować ją do działającej wersji, która odpowiada twojemu db db
bigpotato
Dzięki za to. Nie zdawałem sobie z tego sprawy db:dropi db:createbyłem zbędny.
Grant Birchmeier,
3
To nie aktualizuje schematu, nie jest bezpiecznym sposobem, jeśli refaktoryzujesz migracje.
Claudio Floreani,
to dla mnie najlepsza odpowiedź.
roxdurazo
2
@ClaudioFloreani refactoring migracje prosi o kłopoty. Po uruchomieniu należy je pozostawić w spokoju na stałe.
nrowegt
45

Korzystam z jednego linijki w terminalu.

$ rake db:drop && rake db:create && rake db:migrate && rake db:schema:dump && rake db:test:prepare

Umieściłem to jako alias powłoki i nazwałem to remigrate

Do tej pory możesz łatwo „połączyć” zadania Railsowe:

$ rake db:drop db:create db:migrate db:schema:dump db:test:prepare # db:test:prepare no longer available since Rails 4.1.0.rc1+
TK.
źródło
12
Spowoduje to uruchomienie wszystkich migracji jedna po drugiej, co nie jest skalowalne i jest podatne na błędy. Jestem też całkiem pewien, że db: migracja aktualizuje plik schema.rb, więc twój schemat: zrzut nie robi nic użytecznego.
coreyward
więc jak opróżnić bazę danych? w fazie rozwoju ... wszystko wyjaśnij.
AnApprentice
3
@AnApprentice Możesz biegać db:reset, to tylko Google (lub sprawdź Przewodniki ). Moim komentarzem nie było odradzanie używania tego, ale unikanie używania, db:migrategdy naprawdę chcesz db:schema:load.
coreyward
7
Nawiasem mówiąc, @TK, naprawdę nie musisz uruchamiać wszystkich z nich jako osobnych procesów zależnych od statusu wyjścia ostatniego. Zamiast tego, po prostu przejść wszystkie wymagane zadania rake, tak jak poniżej: rake db:drop db:create db:schema:load.
coreyward
1
To anegdota, ale nigdy nie miałem problemu z uruchomieniem db:migrate... podczas gdy db:schema:loadjest wrażliwy na to, że ktoś zapomina sprawdzić schema.rb w kontroli wersji wraz z nową migracją.
johncip
37

Aktualizacja: W Railsach 5 to polecenie będzie dostępne za pomocą tego polecenia:

rails db:purge db:create db:migrate RAILS_ENV=test


Od najnowszej wersji Rails 4.2 możesz teraz uruchomić:

rake db:purge 

Źródło: commit

# desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases."
  task :purge => [:load_config] do
    ActiveRecord::Tasks::DatabaseTasks.purge_current
  end

Można go używać razem, jak wspomniano powyżej:

rake db:purge db:create db:migrate RAILS_ENV=test
Robbie Guilfoyle
źródło
Jak mówi @bekicot w prostszym języku angielskim db:purge„usuń wszystkie dane, ale zachowaj całą tabelę i kolumny”
MCB
@MCB Myliłem się, sory o tym, db:purge nie zachowuje tabel.
Yana Agun Siswanto
29

W zależności od tego, czego chcesz, możesz użyć…

rake db:create

… Aby zbudować bazę danych od zera config/database.ymllub…

rake db:schema:load

… Aby zbudować bazę danych od zera z schema.rbpliku.

coreyward
źródło
1
Najpierw musisz usunąć bazę danych… lub możesz po prostu usunąć tabele, jeśli wolisz.
coreyward
5
+1 za ładowanie schematu. czasami migracje są pomieszane, ale schemat powinien pozostać nienaruszony.
Danny
Przeczytałem w The Rails 3 Way, że ładowanie schematu jest właściwą drogą, w przeciwieństwie do uruchamiania wszystkich migracji. Nie pamiętam dokładnie, jaki był ich tok rozumowania, ale wydaje się to mieć sens. Jeśli wynik końcowy jest taki sam w obu przypadkach, wydaje się prostsze i mniej podatne na błędy po prostu załadowanie bazy danych ze schematu niż uruchomienie szeregu migracji.
Jason Swett,
3
Powodem jest to, że migracje mają na celu migrację danych i z czasem stają się coraz bardziej kruche wraz ze zmianami modeli. Możesz (i powinieneś) piec w swoich modelach o minimalnym zasięgu do swoich migracji, gdy tylko jest to możliwe, aby zapewnić ich uruchomienie, ale to po prostu nie skaluje się dobrze i jest znacznie mniej wydajne niż budowanie bazy danych na podstawie tego, co wie, że aplikacja jest ostatnim punktem . Po co polegać na migracjach, aby stworzyć bazę danych, która wygląda jak twój schemat, skoro można po prostu zbudować z samego planu?
coreyward
13

Z linii poleceń uruchom

rake db:migrate:reset
użytkownik2747051
źródło
jest to jedyny sposób, który sprawia, że ​​aplikacja ponownie uruchamia wszystkie migracje. Ponieważ każda migracja wprowadza zmiany schema.rbi jeśli tylko dropi create, migratenic nie zrobi (testowane na szynach 6)
szampon
12

Użyj jak

rake db:drop db:create db:migrate db:seed

Wszystko w jednym wierszu. Jest to szybsze, ponieważ środowisko nie jest ponownie ładowane ponownie.

db: upuść - spowoduje usunięcie bazy danych.

db: create - utworzy bazę danych (host / db / hasło zostaną pobrane z config / database.yml)

db: migrate - uruchomi istniejące migracje z katalogu (db / migracja / igration .rb) *.

db: seed - uruchomi dane seed możliwe z katalogu (db /igration / seed.rb) ..

Zwykle wolę:

rake db:reset

robić wszystko naraz.

Twoje zdrowie!

Manish Shrivastava
źródło
1
Chciałbym dodać db: test: przygotuj się na to, na dokładkę. Zależy to oczywiście od tego, czy testujesz.
ctc
db:reset == db:drop + db:schema:load + db:seed,db:migrate:reset == db:drop + db:create + db:migrate
x-yuri
11

Wystarczy wydać sekwencję kroków: upuść bazę danych, a następnie ponownie ją utwórz, migruj dane, a jeśli masz nasiona, siej bazę danych:

rake db:drop db:create db:migrate db:seed

Ponieważ domyślnym środowiskiem dla programistówrake jest programowanie , w przypadku zauważenia wyjątku w testach specyfikacji, należy ponownie utworzyć db dla środowiska testowego w następujący sposób:

RAILS_ENV=test rake db:drop db:create db:migrate

W większości przypadków testowa baza danych jest zasiewana podczas procedur testowych, więc db:seednie jest wymagane wykonanie zadania. W przeciwnym razie musisz przygotować bazę danych:

rake db:test:prepare

lub

RAILS_ENV=test rake db:seed

Dodatkowo, aby użyć zadania ponownego tworzenia , możesz dodać do Rakefile następujący kod:

namespace :db do
   task :recreate => [ :drop, :create, :migrate ] do
      if ENV[ 'RAILS_ENV' ] !~ /test|cucumber/
         Rake::Task[ 'db:seed' ].invoke
      end
   end
end

Następnie wydaj:

rake db:recreate
Малъ Скрылевъ
źródło
8

Możesz ręcznie:

rake db:drop
rake db:create
rake db:migrate

Lub po prostu rake db:reset, który uruchomi powyższe kroki, ale również uruchomi twojedb/seeds.rb plik.

Dodatkowym niuansem jest to, że rake db:resetładuje się bezpośrednio z schema.rbpliku, w przeciwieństwie do ponownego uruchamiania wszystkich plików migracji.

Twoje dane są usuwane we wszystkich przypadkach.

Erik Trautman
źródło
6

Możesz użyć następującego wiersza poleceń:

rake db:drop db:create db:migrate db:seed db:test:clone
użytkownik1358180
źródło
4

Aby usunąć konkretną bazę danych, możesz to zrobić na konsoli Rails:

$rails console
Loading development environment
1.9.3 > ActiveRecord::Migration.drop_table(:<table_name>)
1.9.3 > exit

A następnie ponownie migruj DB

$bundle exec rake db:migrate 
Kush
źródło
4

Na szynach 4.2, aby usunąć wszystkie dane, ale zachować bazę danych

$ bin/rake db:purge && bin/rake db:schema:load

https://github.com/rails/rails/blob/4-2-stable/activerecord/CHANGELOG.md

Yana Agun Siswanto
źródło
Cóż ... Właśnie wypróbowałem, ale nie zachowuje tabel i kolumn. Musisz uruchomić db: migrować po uruchomieniu db: purge. Nie zachowuje to tabel i kolumn. Zachowuje jednak samą bazę danych, więc nie musisz db: create
Freddo
1
@Cedric Masz rację, db: purge nie zachowuje tabeli. Zaktualizowałem kod.
Yana Agun Siswanto
3

Możesz użyć db:reset- do uruchomienia db: drop i db: setup lub db:migrate:reset - który uruchamia db: drop, db: create i db: migrate.

zależny od którego chcesz użyć istnieje schema.rb

Aleksandr Babak
źródło
2

Według przewodnika po Railsach należy użyć tego jednego linera, ponieważ ładowałby się on schema.rbzamiast przeładowywać pliki migracji jeden po drugim:

rake db:reset
Zwycięzca
źródło
1

Ponieważ w fazie projektowania zawsze będziesz chciał ponownie utworzyć bazę danych, możesz zdefiniować zadanie prowizji w folderze lib / task w ten sposób.

  namespace :db do
      task :all => [:environment, :drop, :create, :migrate] do
   end 
end

a w terminalu będziesz biec

rake db:all

odbuduje twoją bazę danych

Obed Lorisson
źródło
1

Myślę, że najlepszym sposobem na uruchomienie tego polecenia:

**rake db:reset** it does db:drop, db:setup
 rake db:setup does db:create, db:schema:load, db:seed
Thorin
źródło
1

Po prostu możesz biegać

rake db:setup

Porzuci bazę danych, utworzy nową bazę danych i zapełni bazę danych z nasion, jeśli utworzyłeś plik z nasionami z pewnymi danymi.

Touseef Murtaza
źródło
1

3 opcje, ten sam wynik:

1. Wszystkie kroki:

  $ rake db:drop           # deletes the database for the current env
  $ rake db:create         # creates the database for the current env
  $ rake db:schema:load    # loads the schema already generated from schema.rb / erases data
  $ rake db:seed           # seed with initial data

2. Zresetuj:

  $ rake db:reset          # drop / schema:load / seed

3. Migruj: reset:

  $ rake db:migrate:reset  # drop / create / migrate
  $ rake db:seed

Uwagi:

  • Jeśli użyto schematu: ładowanie jest szybsze niż wykonywanie wszystkich migracji, ale taki sam wynik.
  • Wszystkie dane zostaną utracone.
  • Możesz uruchamiać wiele grabi w jednej linii.
  • Działa z szynami 3.
urko
źródło
0

Dzisiaj dokonałem kilku zmian w moim schemacie szyn. Uświadomiłem sobie, że potrzebuję dwóch dodatkowych modeli w hierarchii, a niektóre inne należy usunąć. W modelach i kontrolerach było wiele drobnych zmian.

Dodałem dwa nowe modele i stworzyłem je, używając:

rake db:migrate

Następnie edytowałem plik schema.rb. Ręcznie usunąłem stare modele, które nie były już potrzebne, zmieniłem pole klucza obcego zgodnie z wymaganiami i po prostu zmieniłem nieco jego kolejność, aby było dla mnie bardziej zrozumiałe. I usunięte wszelkie migracje, a następnie ponowne prowadził budować poprzez:

rake db:reset

Działa idealnie. Oczywiście wszystkie dane muszą zostać ponownie załadowane. Railsy zdały sobie sprawę, że migracje zostały usunięte i zresetowały znak wysokiego poziomu:

-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])
ardochhigh
źródło