У меня есть следующий файл миграции 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
и он будет перезапущен только один, пропуская все остальные, которые ранее не были откатаны.
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:migrate:down VERSION=your_migrations's_version_number_here
Версия представляет собой числовой префикс в имени файла миграции
Как найти версию:
Ваши файлы миграции хранятся в каталоге rails_root/db/migrate
. Найдите соответствующий файл, для которого вы хотите откат, и скопируйте номер префикса.
например
имя файла: 20140208031131_create_roles.rb
то версия 20140208031131
Вы можете откатить миграцию, используя 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:rollback
Если вы хотите отменить конкретную миграцию с помощью версии, которую вы должны выполнить:
rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION
Если файл миграции, который вы хотите отменить, был вызван db/migrate/20141201122027_create_some_table.rb
, тогда VERSION для этой миграции - 20141201122027
, которая является меткой времени создания этой миграции, а команда для отката этой миграции:
rake db:migrate:down VERSION=20141201122027
Откат последней миграции:
# 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
. И вы всегда можете использовать версию.
например
файл миграции - 20140716084539_create_customer_stats.rb, поэтому команда отката будет,
rake db:migrate:down VERSION=20140716084539
Из Rails Guide
С помощью метода revert
вы можете использовать способность Active Record для отката миграции:
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, чтобы проверить zipcode.
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 и обратимость, замена create_table на drop_table и, наконец, замена вверх и вниз. Это все позаботится о возврате.
Миграции изменяют состояние базы данных с помощью команды
$ bundle exec rake db:migrate
Мы можем отменить один шаг перехода, используя
$ bundle exec rake db:rollback
Чтобы вернуться к началу, мы можем использовать
$ bundle exec rake db:migrate VERSION=0
Как вы могли догадаться, заменяя любое другое число на 0 мигрирует на этот номер версии, где номера версий поступают из перечисления последовательностей миграции
Хорошо в рельсах 5 это довольно легко rake db: migrate: status или rails db: migrate: status
Он был изменен так, чтобы обрабатывать то же самое Затем просто выберите версию, которую вы хотите отменить а затем запустить rake db: migrate VERSION = 2013424230423
Убедитесь, что VERSION - это заглавные буквы
Если у вас возникли проблемы с любым шагом миграции или застряли в середине, просто перейдите в файл миграции и закомментируйте строки, которые уже были перенесены.
Надеюсь, что поможет
Чтобы откатить все миграции до определенной версии (например, 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
Если вы хотите откат и переход, вы можете запустить:
rake db:migrate:redo
То же самое, что:
rake db:rollback
rake db:migrate