Різниця між rake 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/…
Bishisht Bhatta

Ваше розуміння 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: міграція виконує (поодинокі) міграції, які ще не запущені.
  • db: create створює базу даних
  • db: drop видаляє базу даних
  • db: schema: load створює таблиці та стовпці в межах (існуючої) бази даних за схемою.rb

  • db: setup does db: create, db: schema: load, db: seed

  • db: reset does db: drop, db: setup
  • db: migrate: reset does db: drop, db: create, db: migrate

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

Я сподіваюся, що це допомагає.


ОНОВЛЕННЯ для рейок 3.2.12:

Я щойно перевірив джерело, і зараз такі залежності:

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

  • db: налаштування працює db: schema: load, db: seed

  • db: скидання виконує db: drop db: setup
  • db: migrate: повторні запуски (db: migrate: down db: migrate: up) або (db: rollback db: migrate) залежно від зазначеної міграції
  • db: migrate: reset run 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)


16
Ось файл з відповідями :) - github.com/rails/rails/blob/master/activerecord/lib/…
cutalion

3
@cutation: db: setup, безумовно, не запускає db: migrate, тому що було б надто крихким, щоб запустити всі міграції лише для установки db (саме для цього є schema.rb).
moritz

2
Я виконую db: reset, і він засіває мій db. Чому це могло бути?
Алехандро Рідель

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робить A db:dropі db:setup
це скидає базу даних, створює її знову, завантажує схему та ініціалізує з початковими даними

Відповідна частина команд з баз даних.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: мігрувати?
КанадаIT

2

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


0

Ви можете просто заглянути в завдання Active Rake Record, оскільки саме там я вважаю, що вони живуть як у цьому файлі. 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

ОНОВЛЕНО для рейок 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 - Запускається для даної міграції VERSION.

db:migrate:down - Запускає вниз для даної міграції VERSION.

db:migrate:status - Відображає поточний статус міграції.

db:migrate:rollback - Відкидає останню міграцію.

db:version - Друкує поточну версію схеми.

db:forward - Переміщує схему на наступну версію.

db:seed- Запускає файл db / seed.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: налаштування . db:migrate:reset- Працює db: drop , db: create and db: migrate .

db:test:prepare- Перевірте очікувані міграції та завантажте тестову схему. (Якщо ви запускаєте рейк без будь-яких аргументів, це зробить це за замовчуванням.)

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 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.