Разница между 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
) и запускает миграцию в новой базе данных.Пожалуйста, помогите уточнить, если мое понимание пошло не так.
db: schema: load создает таблицы и столбцы в (существующей) базе данных после schema.rb
db: setup делает db: create, db: schema: load, db: seed
Как правило, вы должны использовать db: migrate после внесения изменений в схему через новые файлы миграции (это имеет смысл только в том случае, если в базе данных уже есть данные). db: schema: load используется при настройке нового экземпляра вашего приложения.
Я надеюсь, что это поможет.
ОБНОВЛЕНИЕ для рельсов 3.2.12:
Я только что проверил источник, и зависимости теперь такие:
db: schema: dump сбрасывает текущую схему env (и, похоже, также создает db)
db: setup работает db: schema: load, db: seed
Для получения дополнительной информации, пожалуйста, просмотрите 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 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
Он удаляет базу данных, создает ее снова, загружает схему и инициализирует семенные данные
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.rb
. Вот почему вам нужно убедиться, что ваш файл schema.rb
всегда обновлен и находится под контролем версий.
Вы можете просто посмотреть в задачах 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
Это может не ответить на ваш вопрос, но может дать вам некоторое представление о будущем и посмотреть источник, особенно на файлы и задачи рейка. Поскольку они делают очень хорошую работу, помогая вам использовать рельсы, они не всегда хорошо документируют код. Мы могли бы все помочь, если бы знали, что он должен делать.
rake --tasks
лиrake --tasks
?