Разница между граблями db: migrate, db: reset и db: schema: load.

499

Разница между rake db:migrate и rake db:reset довольно проста в моей голове. Я не понимаю, как rake db:schema:load отличается от предыдущих двух.

Просто чтобы быть уверенным, что я на одной странице:

  • rake db:migrate - Выполняет миграцию, которая еще не была запущена.
  • rake db:reset - очищает базу данных (предположительно делает rake db:drop + rake db:create + rake db:migrate) и запускает миграцию в новой базе данных.

Пожалуйста, помогите уточнить, если мое понимание пошло не так.

  • 10
    rake --tasks ли rake --tasks ?
  • 0
    Вы должны проверить этот блог. jacopretorius.net/2014/02/...
Показать ещё 1 комментарий
Теги:
database
rake

4 ответа

1032
Лучший ответ
  • db: migrate запускает (одиночные) миграции, которые еще не запущены.
  • db: create создает базу данных
  • db: drop удаляет базу данных
  • db: schema: load создает таблицы и столбцы в (существующей) базе данных после schema.rb

  • db: setup делает db: create, db: schema: load, db: seed

  • db: reset делает db: drop, db: setup

Как правило, вы должны использовать db: migrate после внесения изменений в схему через новые файлы миграции (это имеет смысл только в том случае, если в базе данных уже есть данные). db: schema: load используется при настройке нового экземпляра вашего приложения.

Я надеюсь, что это поможет.


ОБНОВЛЕНИЕ для рельсов 3.2.12:

Я только что проверил источник, и зависимости теперь такие:

  • db: create создает базу данных для текущего env
  • db: create: all создает базы данных для всех envs
  • db: drop удаляет базу данных для текущего env
  • db: drop: all удаляет базы данных для всех envs
  • db: migrate запускает миграции для текущего env, которые еще не запущены
  • db: migrate: up запускает одну конкретную миграцию
  • db: migrate: down откат одной конкретной миграции
  • db: migrate: status показывает текущий статус миграции
  • db: rollback откат последней миграции
  • db: forward продвигает текущую версию схемы к следующей.
  • db: seed (только) запускает файл db/seed.rb
  • db: schema: load загружает схему в текущую базу данных env
  • db: schema: dump сбрасывает текущую схему env (и, похоже, также создает db)

  • db: setup работает db: schema: load, db: seed

  • db: reset работает db: drop db: setup
  • db: migrate: redo (db: migrate: down db: migrate: up) или (db: rollback db: migrate) в зависимости от указанной миграции
  • db: migrate: reset работает db: drop db: create db: migrate

Для получения дополнительной информации, пожалуйста, просмотрите https://github.com/rails/rails/blob/v3.2.12/activerecord/lib/active_record/railties/databases.rake (для Rails 3.2.x) и https://github.com/rails/rails/blob/v4.0.5/activerecord/lib/active_record/railties/databases.rake (для Rails 4.0.x)

  • 14
    Вот файл с ответами :) - github.com/rails/rails/blob/master/activerecord/lib/…
  • 3
    @cutation: db: setup, безусловно, не запускает db: migrate, потому что было бы слишком хрупко запускать все миграции только для настройки db (для этого предназначен schema.rb).
Показать ещё 6 комментариев
14

TL;DR

Используйте

  • rake db:migrate Если вы хотите внести изменения в схему
  • rake db:reset Если вы хотите сбросить базу данных, перезагрузите схему из schema.rb и повторно настройте базу данных
  • rake db:schema:load Если вы хотите использовать reset базу данных для схемы, как указано в schema.rb (Это приведет к удалению всех данных)

Разъяснения

rake db:schema:load настроит схему, указанную в файле schema.rb. Это полезно для новой установки приложения, так как занимает не так много времени, как db:migrate

Важное примечание. db:schema:load будет удалять данные на сервере.

rake db:migrate вносит изменения в существующую схему. Это похоже на создание версий схемы. db:migrate будет выглядеть в db/migrate/ для любых рубиновых файлов и выполнять миграции, которые еще не запущены, начиная с самого старого. Rails знает, какой файл является самым старым, посмотрев метку времени в начале имени файла миграции. db:migrate поставляется с преимуществом, что данные также могут быть помещены в базу данных. На самом деле это не очень хорошая практика. Лучше использовать rake db:seed для добавления данных.

rake db:migrate предоставляет задачи вверх, down и т.д. который позволяет команды типа rake db:rollback и делает его самой полезной командой.

rake db:reset делает a db:drop и db:setup
Он удаляет базу данных, создает ее снова, загружает схему и инициализирует семенные данные

Соответствующая часть команд из databases.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
  • 0
    Поэтому, если вы создадите свою производственную схему, используя db: schema: load (созданную из серии предыдущих миграций), вы будете знать, какие миграции (те, которые участвовали в создании исходного schema.rb) не нужно запускать в будущем вызовы db: migrate?
2

Насколько я понимаю, он собирается удалить вашу базу данных и воссоздать ее на основе вашего файла db/schema.rb. Вот почему вам нужно убедиться, что ваш файл schema.rb всегда обновлен и находится под контролем версий.

0

Вы можете просто посмотреть в задачах Active Record Rake, так как я считаю, что они живут так же, как в этом файле. https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/lib/active_record/tasks/database_tasks.rb

Что они делают, так это ваш вопрос?

Это зависит от того, откуда они взялись, и это просто и пример, чтобы показать, что они различаются в зависимости от задачи. Здесь у нас есть другой файл, полный заданий.

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

который выполняет эти задачи.

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

Это может не ответить на ваш вопрос, но может дать вам некоторое представление о будущем и посмотреть источник, особенно на файлы и задачи рейка. Поскольку они делают очень хорошую работу, помогая вам использовать рельсы, они не всегда хорошо документируют код. Мы могли бы все помочь, если бы знали, что он должен делать.

  • 0
    Пожалуйста, указывайте соответствующие части статьи на случай, если она будет удалена. Не предлагайте делать что-то без объяснения причин.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню