it-roy-ru.com

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

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

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

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

  • db: setup выполняет db: create, db: schema: load, db: seed

  • db: сброс выполняет db: drop, db: setup

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

Надеюсь, это поможет.


ОБНОВЛЕНИЕ для Rails 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: setup запускает db: schema: load, db: seed

  • db: сброс запускает db: drop db: setup
  • выполняется db: migrate: redo (db: migrate: вниз db: migrate: вверх) или (db: откат db: мигрировать) в зависимости от указанной миграции
  • db: migrate: сброс запускает db: drop db: создавать 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)

1226
moritz

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/ любые Ruby файлы и выполнять миграции, которые еще не запущены, начиная с самых старых. Rails знает, какой файл самый старый, посмотрев на метку времени в начале имени файла миграции. db:migrate дает то преимущество, что данные также могут быть помещены в базу данных. Это на самом деле не очень хорошая практика. Лучше использовать rake db:seed для добавления данных.

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

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

Соответствующая часть команд из database.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
21
sudo bangbang

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

2
Simon Bagreev

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

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

0
Douglas G. Allen