У меня есть следующий файл миграции db\migrate\20100905201547_create_blocks.rb
Как конкретно откатить этот файл миграции?
У меня есть следующий файл миграции db\migrate\20100905201547_create_blocks.rb
Как конкретно откатить этот файл миграции?
Ответы:
rake db:rollback STEP=1
Есть способ сделать это, если миграция, которую вы хотите откатить, является последней примененной. Вы можете заменить 1 тем количеством миграций, которое хотите вернуться.
Например:
rake db:rollback STEP=5
Также будет выполнен откат всей миграции, произошедшей позже (4, 3, 2, а также 1).
Чтобы откатить все миграции обратно (и включая) целевую миграцию, используйте: (Эта исправленная команда была добавлена ПОСЛЕ всех комментариев, указывающих на ошибку в исходном сообщении)
rake db:migrate VERSION=20100905201547
Чтобы откатить ТОЛЬКО ОДНУ конкретную миграцию (OUT OF ORDER), используйте:
rake db:migrate:down VERSION=20100905201547
Обратите внимание, что это НЕ отменит любые промежуточные миграции - только тот, который указан. Если это не то, что вы намеревались, вы можете безопасно запустить, rake db:migrate
и он будет перезапущен только тот, пропуская другие, которые ранее не были откатаны.
И если вы когда-нибудь захотите перенести одну миграцию не по порядку, есть и обратная сторона db:migrate:up
:
rake db:migrate:up VERSION=20100905201547
STEP=-1
. Я сделал это однажды, и это сошло с ума, откатывая все назад. Не хорошо! Это был Rails 4.2 - думаю, это может быть исправлено.
rake db:migrate:down VERSION=20100905201547
откатит конкретный файл.
Чтобы найти версию всех миграций, вы можете использовать эту команду:
rake db:migrate:status
Или просто префикс имени файла миграции - это версия, которую нужно откатить.
См. Руководство по Ruby on Rails по миграции.
Для отката последней миграции вы можете сделать:
rake db:rollback
Если вы хотите откатить определенную миграцию с версией, вы должны сделать:
rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION
Например, если версия 20141201122027, вы будете делать:
rake db:migrate:down VERSION=20141201122027
откатить эту конкретную миграцию.
Вы можете откатить миграцию, используя rake db:rollback
различные параметры. Синтаксис будет отличаться в зависимости от ваших требований.
Если вы хотите откатить только последнюю миграцию, то вы можете использовать либо
rake db:rollback
или
rake db:rollback STEP=1
Если вы хотите откатить количество миграций сразу, вы просто передаете аргумент:
rake db:rollback STEP=n
где n
число миграций для отката, считая от последней миграции.
Если вы хотите выполнить откат к определенной миграции, вы должны передать версию миграции следующим образом:
rake db:migrate:down VERSION=xxxxx
где xxxxx - номер версии миграции.
rake db:migrate:down VERSION=your_migrations's_version_number_here
Версия - это числовой префикс в имени файла миграции.
Как найти версию :
Ваши файлы миграции хранятся в вашем rails_root/db/migrate
каталоге. Найдите подходящий файл, до которого вы хотите выполнить откат, и скопируйте номер префикса.
например
имя файла: 20140208031131_create_roles.rb
тогда версия20140208031131
rake db:migrate:status
Откат последней миграции:
# rails < 5.0
rake db:rollback
# rails >= 5.0
rake db:rollback
# or
rails db:rollback
Откат последнего n
количества миграций
# rails < 5.0
rake db:rollback STEP=2
# rails >= 5.0
rake db:rollback STEP=2
# or
rails db:rollback STEP=2
Откат определенной миграции
# rails < 5.0
rake db:migrate:down VERSION=20100905201547
# rails >= 5.0
rake db:migrate:down VERSION=20100905201547
# or
rails db:migrate:down VERSION=20100905201547
Для отката последней миграции вы можете сделать:
rake db:rollback
Если вы хотите откатить определенную миграцию с версией, вы должны сделать:
rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION
Если файл миграции, который вы хотите откатить, был вызван db/migrate/20141201122027_create_some_table.rb
, то VERSION для этой миграции - 20141201122027
это отметка времени, когда была создана эта миграция, и команда для отката этой миграции будет:
rake db:migrate:down VERSION=20141201122027
Чтобы откатить все миграции до определенной версии (например 20181002222222
), используйте:
rake db:migrate VERSION=20181002222222
(Обратите внимание, что это использует db:migrate
- не так, db:migrate:down
как в других ответах на этот вопрос.)
Предполагая, что указанная версия миграции старше текущей версии, это откатит все миграции до указанной версии, но не включая ее.
Например, если rake db:migrate:status
изначально отображается:
(... some older migrations ...)
up 20181001002039 Some migration description
up 20181002222222 Some migration description
up 20181003171932 Some migration description
up 20181004211151 Some migration description
up 20181005151403 Some migration description
Бег:
rake db:migrate VERSION=20181002222222
Приведет к:
(... some older migrations ...)
up 20181001002039 Some migration description
up 20181002222222 Some migration description
down 20181003171932 Some migration description
down 20181004211151 Some migration description
down 20181005151403 Some migration description
Ссылка: https://makandracards.com/makandra/845-migrate-or-revert-only-some-migrations
Вы можете использовать возможность Active Record для отката миграций, используя revert
метод:
require_relative '20100905201547_create_blocks'
class FixupCreateBlock < ActiveRecord::Migration
def change
revert CreateBlock
create_table(:apples) do |t|
t.string :variety
end
end
end
revert
Метод также принимает блок инструкций для заднего хода. Это может быть полезно для возврата выбранных частей предыдущих миграций. Например, давайте представим, что CreateBlock зафиксирован, и позже было решено, что будет лучше использовать проверки Active Record вместо ограничения CHECK для проверки почтового индекса.
class DontUseConstraintForZipcodeValidationMigration < ActiveRecord::Migration
def change
revert do
# copy-pasted code from CreateBlock
reversible do |dir|
dir.up do
# add a CHECK constraint
execute <<-SQL
ALTER TABLE distributors
ADD CONSTRAINT zipchk
CHECK (char_length(zipcode) = 5);
SQL
end
dir.down do
execute <<-SQL
ALTER TABLE distributors
DROP CONSTRAINT zipchk
SQL
end
end
# The rest of the migration was ok
end
end
end
Та же самая миграция также могла быть написана без использования revert, но для этого потребовалось бы еще несколько шагов: изменение порядка create_table и reversible, замена create_table на drop_table и, наконец, замена up на down и наоборот. Это все позаботится о возвращении.
Миграции изменяют состояние базы данных с помощью команды
$ bundle exec rake db:migrate
Мы можем отменить один шаг миграции, используя
$ bundle exec rake db:rollback
Чтобы вернуться к началу, мы можем использовать
$ bundle exec rake db:migrate VERSION=0
Как вы можете догадаться, замена любого другого числа на 0 мигрирует к этому номеру версии, где номера версий происходят из списка последовательных миграций
Что ж, в rails 5 это довольно просто: rake db: migrate: status или rails db: migrate: status
Он был изменен, чтобы обрабатывать их одинаково. Затем просто выберите версию, которую вы хотите откатить, и затем запустите rake db: migrate VERSION = 2013424230423
Убедитесь, что ВЕРСИЯ - все заглавные буквы
Если у вас есть проблема с каким-либо шагом миграции или вы застряли в середине, просто перейдите к файлу миграции и закомментируйте строки, которые уже были перенесены.
надеюсь, это поможет
Class.down
stackoverflow.com/questions/753919/run-a-single-migration-file