ruby-on-rails - rails rake db tasks




Разница между rake db: migrate db: reset и db: schema: load (3)

TLDR

использование

  • rake db:migrate Если вы хотите внести изменения в схему
  • rake db:reset Если вы хотите сбросить базу данных, перезагрузите схему из schema.rb и обновите базу данных
  • rake db:schema:load Если вы хотите сбросить базу данных в схему, как указано в 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 предоставляет задачи up , down т. д., что позволяет использовать команды, такие как rake db:rollback и делает его самой полезной командой.

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

Соответствующая часть команд из github.com/rails/rails/blob/master/activerecord/lib/…

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

Разница между 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 ) и запускает миграцию в новой базе данных.

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


Вы можете просто посмотреть в задачах 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

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


  • 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: все создает базы данных для всех envs
  • db: drop падает база данных для текущего env
  • db: drop: все отбрасывает базы данных для всех envs
  • db: migrate запускает миграции для текущего env, которые еще не запущены
  • db: migrate: up запускает одну конкретную миграцию
  • db: migrate: down возвращает одну конкретную миграцию
  • db: migrate: статус показывает текущий статус миграции
  • db: rollback возвращает последнюю миграцию
  • db: forward переводит текущую версию схемы на следующую
  • db: seed (only) запускает файл db / seed.rb
  • db: schema: загрузка загружает схему в текущую базу данных env
  • db: schema: дамп сбрасывает текущую схему env (и, похоже, также создает db)

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

  • db: reset run db: drop db: setup
  • db: migrate: redo run (db: migrate: down db: migrate: up) или (db: rollback db: migrate) в зависимости от указанной миграции
  • db: migrate: reset running 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)





rake