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

619

Разница между 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?
zx1986
Вы должны проверить этот блог. jacopretorius.net/2014/02/…
Бишишт Бхатта
Ваше понимание rake db:migrateверно, но ваше понимание rake db:resetнеправильно. Смотрите самый верхний ответ от Морица.
Магне
1
Кстати, по состоянию на рельсы 5, эти команды могут быть вызваны , как rails db:migrate, rails db:reset, rails db:schema:load. См stackoverflow.com/questions/38403533/...
Purplejacket

Ответы:

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

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

  • дБ: сброс делает дБ: падение, дБ: настройка
  • db: мигрировать: сброс делает db: отбрасывать, db: создавать, db: мигрировать

Обычно вы используете 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: статус показывает текущий статус миграции
  • db: откат откатывает последнюю миграцию
  • db: forward переводит текущую версию схемы в следующую
  • db: seed (только) запускает файл db / seed.rb
  • db: schema: load загружает схему в базу данных текущего env
  • db: schema: dump создает дамп текущей схемы env (и, похоже, также создает базу данных)

  • db: установка запускается db: схема: загрузка, db: семя

  • дб: сброс работает дб: падение дб: настройка
  • db: migrate: повтор выполнения (db: миграция: вниз db: миграция: вверх) или (db: откат db: миграция) в зависимости от указанной миграции
  • db: мигрировать: сброс выполняется db: отбрасывать db: создавать db: мигрировать

Для получения дополнительной информации просмотрите 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 / database.rake (для Rails 4.0.x)

Moritz
источник
16
Вот файл с ответами :) - github.com/rails/rails/blob/master/activerecord/lib/…
cutalion
3
@cutation: db: setup, безусловно, не запускает db: migrate, потому что было бы слишком хрупко запускать все миграции только для настройки db (для этого предназначен schema.rb).
Мориц
2
Я выполняю db: reset, и он заполняет мою базу данных. Почему это может быть?
Алехандро Ридель
DB: установка также запускается db:createпри необходимости. По крайней мере, на рельсах 4.0.2.
Дан
Rails 4 будет работать rake db:migrateпри вызове, rake db:setupесли есть ожидающие миграции, но не будет выполнять ожидающие миграции.
Пуян Хосрави,
24

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

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

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

ОБНОВЛЕНО для Rails 5:

db:create- Создает базу данных для текущей среды RAILS_ENV . Если RAILS_ENV не указан, по умолчанию используются базы данных разработки и тестирования.

db:create:all - Создает базу данных для всех сред.

db:drop- Удаляет базу данных для текущей среды RAILS_ENV . Если RAILS_ENV не указан, по умолчанию используются базы данных разработки и тестирования.

db:drop:all - Удаляет базу данных для всех сред.

db:migrate- Запускает миграции для текущей среды, которые еще не запущены. По умолчанию он запускает миграции только в среде разработки.

db:migrate:redo- Запускает db: migrate: вниз и db: migrate: вверх или db: migrate: откат и db: migrate: вверх в зависимости от указанной миграции.

db:migrate:up - Запускает для данной миграции версии.

db:migrate:down - запускает вниз для данной миграции версии.

db:migrate:status - Отображает текущий статус миграции.

db:migrate:rollback - Откатывает последнюю миграцию.

db:version - Печатает текущую версию схемы.

db:forward - выдвигает схему к следующей версии.

db:seed- Запускает файл db / seeds.rb .

db:schema:loadВосстанавливает базу данных из файла schema.rb .

db:schema:dumpСохраняет схему текущей среды в db / schema.rb .

db:structure:load- воссоздает базу данных из structure.sql файла.

db:structure:dump- Сбрасывает схему текущей среды в db / structure.sql . (Вы можете указать другой файл с помощью SCHEMA=db/my_structure.sql)

db:setupЗапускает db: create , db: schema: load и db: seed .

db:resetЗапускает db: drop и db: setup . db:migrate:reset- Запускает db: drop , db: create и db: migrate .

db:test:prepare- Проверьте наличие отложенных миграций и загрузите схему тестирования. (Если вы запустите rake без аргументов, он сделает это по умолчанию.)

db:test:clone - Воссоздать тестовую базу данных из схемы базы данных текущей среды.

db:test:clone_structure- Аналогичен db: test: clone , но он гарантирует, что ваша тестовая база данных будет иметь ту же структуру, включая наборы символов и сопоставления, что и база данных вашей текущей среды.

db:environment:set- Установите текущую RAILS_ENV среды в ar_internal_metadata таблице. (Используется как часть проверки защищенной среды.)

db:check_protected_environments- Проверяет, можно ли выполнить разрушительное действие в текущей среде RAILS_ENV . Используется внутри при выполнении разрушительного действия, такого как db: drop или db: schema: load .

Ваня Скоцик
источник