Różnica między prowizją db: migracja db: reset i db: schema: load

619

Różnica między rake db:migratei rake db:resetjest całkiem wyraźna w mojej głowie. Rzecz, której nie rozumiem, rake db:schema:loadróżni się od poprzednich dwóch.

Dla pewności, że jestem na tej samej stronie:

  • rake db:migrate - Uruchamia migracje, które nie zostały jeszcze uruchomione.
  • rake db:reset- Czyści bazę danych (prawdopodobnie robi rake db:drop+ rake db:create+ rake db:migrate) i uruchamia migrację na świeżej bazie danych.

Proszę o pomoc w wyjaśnieniu, jeśli moje zrozumienie poszło nie tak.

Gaurav Agarwal
źródło
10
Czy rake --taskspomaga
zx1986,
Powinieneś sprawdzić tego bloga. jacopretorius.net/2014/02/…
Bishisht Bhatta
Twoje zrozumienie rake db:migratejest prawidłowe, ale twoje zrozumienie rake db:resetjest błędne. Zobacz najwyższą odpowiedź od Moritza.
Magne
1
BTW, jak Rails 5, polecenia te mogą być powoływane jako rails db:migrate, rails db:reset, rails db:schema:load. Zobacz stackoverflow.com/questions/38403533/…
Purplejacket,

Odpowiedzi:

1303
  • db: migrate uruchamia (pojedyncze) migracje, które jeszcze się nie uruchomiły.
  • db: create tworzy bazę danych
  • db: drop usuwa bazę danych
  • db: schema: load tworzy tabele i kolumny w (istniejącej) bazie danych zgodnie ze schema.rb

  • db: setup robi db: create, db: schema: load, db: seed

  • db: reset robi db: drop, db: setup
  • db: migrate: reset robi db: drop, db: create, db: migrate

Zazwyczaj korzystasz z db: migruj po wprowadzeniu zmian w schemacie za pomocą nowych plików migracji (ma to sens tylko wtedy, gdy w bazie danych są już dane). db: schema: load jest używany podczas konfigurowania nowego wystąpienia aplikacji.

Mam nadzieję że to pomogło.


AKTUALIZACJA dla szyn 3.2.12:

Właśnie sprawdziłem źródło i zależności są teraz takie:

  • db: create tworzy bazę danych dla bieżącego środowiska
  • db: create: all tworzy bazy danych dla wszystkich środowisk
  • db: drop upuszcza bazę danych dla bieżącego środowiska
  • db: drop: wszystkie upuszcza bazy danych dla wszystkich środowisk
  • db: migrate uruchamia migracje dla bieżącej env, które jeszcze nie zostały uruchomione
  • db: migrate: up uruchamia jedną konkretną migrację
  • db: migrate: down przywraca jedną konkretną migrację
  • db: migrate: status pokazuje aktualny status migracji
  • db: wycofanie przywraca ostatnią migrację
  • db: forward przesuwa bieżącą wersję schematu do następnej
  • db: seed (tylko) uruchamia plik db / seed.rb
  • db: schemat: ładuje ładuje schemat do bazy danych bieżącego środowiska env
  • db: schema: dump zrzuca bieżący schemat env (i wydaje się również tworzyć db)

  • db: setup uruchamia db: schema: load, db: seed

  • db: reset uruchamia db: drop db: setup
  • db: migrate: redo działa (db: migrate: down db: migrate: up) lub (db: rollback db: migrate) w zależności od określonej migracji
  • db: migrate: reset uruchamia db: drop db: create db: migrate

Więcej informacji można znaleźć na https://github.com/rails/rails/blob/v3.2.12/activerecord/lib/active_record/railties/databases.rake (dla Rails 3.2.x) i https: // github .com / rails / rails / blob / v4.0.5 / activerecord / lib / active_record / railties / databases.rake (dla Rails 4.0.x)

Moritz
źródło
16
Oto plik z odpowiedziami :) - github.com/rails/rails/blob/master/activerecord/lib/…
cutalion
3
@cutation: db: setup na pewno nie uruchamia db: migrate, ponieważ byłoby to zbyt kruche, aby uruchamiać wszystkie migracje tylko dla konfiguracji db (po to jest schema.rb).
moritz
2
Wykonuję db: reset, a to uruchamia moją db. Dlaczego tak może być?
Alejandro Riedel
db: Instalator uruchamia się także w db:createrazie potrzeby. Przynajmniej od szyn 4.0.2.
Dan
Railsy 4 będą działać rake db:migratepodczas wywoływania, rake db:setupjeśli istnieją oczekujące migracje, ale nie wykonają oczekujących migracji.
Pooyan Khosravi
24

TLDR

Posługiwać się

  • rake db:migrate Jeśli chcesz wprowadzić zmiany w schemacie
  • rake db:resetJeśli chcesz usunąć bazę danych, załaduj ponownie schemat z schema.rbi ponownie uruchom bazę danych
  • rake db:schema:loadJeśli chcesz zresetować bazę danych do schematu zgodnie z opisem w schema.rb(spowoduje to usunięcie wszystkich danych)

Objaśnienia

rake db:schema:loadskonfiguruje schemat zgodnie z schema.rbplikiem. Jest to przydatne w przypadku nowej instalacji aplikacji, ponieważ nie zajmuje tyle czasu, codb:migrate

Ważna uwaga db:schema:loadspowoduje usunięcie danych z serwera.

rake db:migratewprowadza zmiany do istniejącego schematu. To jak tworzenie wersji schematu. db:migratewyszuka db/migrate/wszystkie pliki ruby ​​i wykona migracje, które nie zostały jeszcze uruchomione, zaczynając od najstarszej. Railsy wiedzą, który plik jest najstarszy, patrząc na znacznik czasu na początku nazwy pliku migracji. db:migratema tę zaletę, że dane można również umieszczać w bazie danych. To właściwie nie jest dobra praktyka. Lepiej jest używać rake db:seeddo dodawania danych.

rake db:migratezapewnia zadania w górę , w dół itp., które umożliwiają polecenia takie jak rake db:rollbacki sprawiają, że jest to najbardziej przydatne polecenie.

rake db:resetrobi a db:dropi db:setup
Upuszcza bazę danych, tworzy ją ponownie, ładuje schemat i inicjuje z danymi źródłowymi

Odpowiednia część poleceń z bazy danych.rake


namespace :schema do
  desc 'Creates a db/schema.rb file that is portable against any DB supported by Active Record'
  task :dump => [:environment, :load_config] do
    require 'active_record/schema_dumper'
    filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
    File.open(filename, "w:utf-8") do |file|
      ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
    end
    db_namespace['schema:dump'].reenable
  end

  desc 'Loads a schema.rb file into the database'
  task :load => [:environment, :load_config, :check_protected_environments] do
    ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV['SCHEMA'])
  end

  # desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
  task :reset => [ 'db:drop', 'db:setup' ]

namespace :migrate do
  # desc  'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
  task :redo => [:environment, :load_config] do
    if ENV['VERSION']
      db_namespace['migrate:down'].invoke
      db_namespace['migrate:up'].invoke
    else
      db_namespace['rollback'].invoke
      db_namespace['migrate'].invoke
    end
  end
Sudo Bangbang
źródło
Więc jeśli utworzysz schemat produkcyjny za pomocą db: schema: load (utworzony z serii poprzednich migracji), zorientuje się, które migracje (te, które brały udział w tworzeniu początkowego schematu.rb) nie muszą być uruchamiane w przyszłości wywołania db: migrować?
Kanada,
2

O ile rozumiem, usunie bazę danych i ponownie ją utworzy na podstawie db/schema.rbpliku. Dlatego musisz upewnić się, że schema.rbplik jest zawsze aktualny i znajduje się pod kontrolą wersji.

Simon Bagreev
źródło
0

Możesz po prostu spojrzeć na zadania Active Record Rake, ponieważ tutaj, jak sądzę, mieszkają tak jak w tym pliku. https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/lib/active_record/tasks/database_tasks.rb

Co robią, to twoje pytanie jest słuszne?

To zależy od tego, skąd pochodzą, a to tylko przykład pokazujący, że różnią się w zależności od zadania. Tutaj mamy inny plik pełen zadań.

https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/Rakefile

który ma te zadania.

namespace :db do
  task create: ["db:mysql:build", "db:postgresql:build"]
  task drop: ["db:mysql:drop", "db:postgresql:drop"]
end

To może nie odpowiedzieć na twoje pytanie, ale może dać ci wgląd w źródła i przejrzyj źródła, szczególnie pliki rake i zadania. Ponieważ wykonują całkiem niezłą robotę, pomagając w używaniu szyn, nie zawsze tak dobrze dokumentują kod. Wszyscy moglibyśmy pomóc, jeśli wiemy, co ma zrobić.

Douglas G. Allen
źródło
Proszę podać odpowiednie części artykułu na wypadek jego usunięcia. Nie sugeruj robienia czegoś bez wyjaśnienia dlaczego.
PhilT,
0

ZAKTUALIZOWANO dla Rails 5:

db:create- Tworzy bazę danych dla bieżącego środowiska RAILS_ENV . Jeśli RAILS_ENV nie jest określony, domyślnie są to baz danych programowania i testowania.

db:create:all - Tworzy bazę danych dla wszystkich środowisk.

db:drop- Zrzuca bazę danych dla bieżącego środowiska RAILS_ENV . Jeśli RAILS_ENV nie jest określony, domyślnie są to baz danych programowania i testowania.

db:drop:all - Zrzuca bazę danych dla wszystkich środowisk.

db:migrate- Uruchamia migracje dla bieżącego środowiska, które jeszcze nie zostało uruchomione. Domyślnie migracje będą uruchamiane tylko w środowisku programistycznym.

db:migrate:redo- Uruchamia db: migracja: w dół i db: migracja: w górę lub db: migracja: wycofanie i db: migracja: w górę w zależności od określonej migracji.

db:migrate:up - Uruchamia się dla danej WERSJI migracji.

db:migrate:down - Działa w dół dla danej WERSJI migracji.

db:migrate:status - Wyświetla bieżący status migracji.

db:migrate:rollback - Cofa ostatnią migrację.

db:version - Drukuje bieżącą wersję schematu.

db:forward - Przesuwa schemat do następnej wersji.

db:seed- Uruchamia plik db / seeds.rb .

db:schema:loadOdtwarza bazę danych z pliku schema.rb .

db:schema:dumpZrzuca schemat bieżącego środowiska do db / schema.rb .

db:structure:load- Odtwarza bazę danych z pliku structure.sql .

db:structure:dump- Zrzuca schemat bieżącego środowiska do db / structure.sql . (Możesz określić inny plik za pomocą SCHEMA=db/my_structure.sql)

db:setupUruchamia db: create , db: schema: load i db: seed .

db:resetUruchamia db: drop i db: setup . db:migrate:reset- Uruchamia db: drop , db: create i db: migrate .

db:test:prepare- Sprawdź oczekujące migracje i załaduj schemat testowy. (Jeśli uruchomisz rake bez żadnych argumentów, zrobi to domyślnie.)

db:test:clone - Odtwórz ponownie testową bazę danych ze schematu bazy danych bieżącego środowiska.

db:test:clone_structure- Podobne do db: test: klon , ale zapewni, że twoja testowa baza danych będzie miała taką samą strukturę, w tym zestawy znaków i zestawienia, jak baza danych bieżącego środowiska.

db:environment:set- Ustaw aktualny RAILS_ENV środowiska w ar_internal_metadata tabeli. (Używany jako część kontroli chronionego środowiska).

db:check_protected_environments- Sprawdza, czy w obecnym środowisku RAILS_ENV można wykonać akcję destrukcyjną . Używane wewnętrznie podczas działania destrukcyjnego, takiego jak db: drop lub db: schema: load .

Ваня Скоцик
źródło