Różnica między rake db: migrate db: reset i db: schema: load

Różnica między rake db:migrate i rake db:reset jest dość jasna w mojej głowie. Rzecz, której nie rozumiem, różni się od dwóch poprzednich.

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 przeprowadza migrację na świeżej bazie danych.

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

Author: ekremkaraca, 2012-04-24

4 answers

  • db: migrate uruchamia (pojedyncze) migracje, które jeszcze nie zostały uruchomione.
  • db: create tworzy bazę danych
  • db: drop usuwa bazę danych
  • Db: schema: load tworzy tabele i kolumny w (istniejącej) bazie danych według schematu.rb

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

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

Zazwyczaj używasz db: migrate po wprowadzeniu zmian w schemacie poprzez nowe pliki migracji (ma to sens tylko wtedy, gdy w bazie danych są już dane). db: schema: load jest używany podczas konfigurowania nowej instancji aplikacji.

Mam nadzieję, że to pomoże.

Aktualizacja dla rails 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 env
  • db: create: all tworzy bazy danych dla wszystkich envs
  • db: drop usuwa bazę danych dla bieżącego env
  • db: drop: all usuwa bazy danych dla wszystkich ENV
  • db: migrate uruchamia migracje dla bieżącego env, które nie zostały jeszcze uruchomione
  • db: migrate: up uruchamia jedną migrację specyficzną
  • db: migrate: down rolls back one specific migration
  • db: migrate: status pokazuje bieżący status migracji
  • db: rollback rolls back The last migracja
  • db: forward przenosi aktualną wersję schematu do następnej
  • db: seed (tylko) uruchamia db / seed.plik rb
  • db: schema: load ładuje schemat do bieżącej bazy danych env
  • Db: schema: dump zrzuca bieżący schemat env (i wydaje się, że tworzy również db)

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

  • db:reset uruchamia db: drop db: setup
  • db: migrate: redo uruchamia (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

Aby uzyskać więcej informacji, zapoznaj się z https://github.com/rails/rails/blob/v3.2.12/activerecord/lib/active_record/railties/databases.rake (dla Rails 3.2.x) oraz https://github.com/rails/rails/blob/v4.0.5/activerecord/lib/active_record/railties/databases.rake (dla Rails 4.0.x)

 1149
Author: moritz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-27 14:27:48

TLDR

Użycie

  • rake db:migrate Jeśli chcesz wprowadzić zmiany w schemacie
  • rake db:reset Jeśli chcesz upuścić bazę danych, przeładuj schemat z schema.rb i prześlij ponownie bazę danych
  • rake db:schema:load Jeśli chcesz zresetować bazę danych do schematu podanego w schema.rb (spowoduje to usunięcie wszystkich danych)

Objaśnienia

rake db:schema:load skonfiguruje schemat podany w pliku schema.rb. Jest to przydatne w przypadku świeżej instalacji aplikacji, ponieważ nie zajmuje to tyle czasu, co db:migrate

Ważna uwaga, db:schema:load usunie dane na serwerze.

rake db:migrate wprowadza zmiany do istniejącego schematu. To jak tworzenie wersji schematu. db:migrate poszukuje w db/migrate/ plików ruby i wykonuje migracje, które nie są jeszcze uruchomione, zaczynając od najstarszych. Rails wie, który plik jest najstarszy, patrząc na znacznik czasu na początku nazwy pliku migracji. db:migrate ma tę zaletę, że dane mogą być również umieszczane w bazie danych. To nie jest dobra praktyka. Lepiej użyć rake db:seed do dodania danych.

rake db:migrate dostarcza zadania do góry, down etc, który włącza polecenia takie jak {[18] } i czyni go najbardziej użytecznym poleceniem.

rake db:reset Czy a db:drop i db:setup
W tym celu należy utworzyć bazę danych, wczytać schemat i zainicjalizować go za pomocą danych nasiennych.]}

Odpowiednia część poleceń z baz danych .grabie


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
 16
Author: sudo bangbang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-14 00:09:49

Z tego co rozumiem, to upuści twoją bazę danych i odtworzy ją na podstawie Twojego pliku db/schema.rb. Dlatego musisz się upewnić, że Twój plik schema.rb jest zawsze aktualny i znajduje się pod kontrolą wersji.

 2
Author: Simon Bagreev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-24 16:25:21

Możesz po prostu zajrzeć do zadań Rake Active Record, ponieważ wierzę, że tam mieszkają, jak w tym pliku. https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/lib/active_record/tasks/database_tasks.rb

To, co robią, to twoje pytanie?

To zależy od tego, skąd pochodzą, a to jest tylko i przykład, aby pokazać, że różnią się w zależności od zadania. Tutaj mamy inny plik pełen zadania.

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 pewien wgląd w śmiało i spojrzeć na źródło zwłaszcza plików rake i zadań. Ponieważ robią całkiem dobrą robotę pomagając Ci używać rails, nie zawsze dokumentują kod tak dobrze. Wszyscy możemy tam pomóc, jeśli wiemy, co ma zrobić.

 0
Author: Douglas G. Allen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-04 22:24:09