Как откатить конкретную миграцию?

660

У меня есть следующий файл миграции db\migrate\20100905201547_create_blocks.rb

Как я могу откат этого файла миграции?

  • 1
    Это решает проблему? Вам просто нужно сделать Class.down stackoverflow.com/questions/753919/run-a-single-migration-file
  • 4
    Вся информация о миграциях здесь
Показать ещё 1 комментарий
Теги:
schema
database-schema

13 ответов

1052
Лучший ответ
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 и он будет перезапущен только один, пропуская все остальные, которые ранее не были откатаны.

  • 14
    «Чтобы выполнить откат к определенной версии» - разве команда, которая следует только за откатом определенной миграции, а не откат до этой версии?
  • 10
    «Для отката на конкретную версию используйте ...» Этот ответ неверен! Это откатит миграцию изолированно, как объяснено другими ответами.
Показать ещё 5 комментариев
854
rake db:migrate:down VERSION=20100905201547

откат конкретного файла.


Чтобы найти версию всех миграций, вы можете использовать эту команду:

rake db:migrate:status

Или просто префикс имени файла миграции - это версия, которую вам нужно отменить.


См. запись руководства Ruby on Rails при переносе.

  • 47
    Определенно предпочтительный ответ на мой взгляд.
  • 0
    Будет ли этот откат перенесен на все удаленные серверы, например. Heroku? Было бы лучше создать новый файл миграции, чтобы отменить определенные изменения?
Показать ещё 8 комментариев
47

Чтобы отменить последнюю миграцию, вы можете сделать:

rake db:rollback

Если вы хотите отменить конкретную миграцию с помощью версии, которую вы должны выполнить:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Например, если версия 20141201122027, вы будете делать:

rake db:migrate:down VERSION=20141201122027

для отката этой специфической миграции.

25

rake db:migrate:down VERSION=your_migrations's_version_number_here

Версия представляет собой числовой префикс в имени файла миграции

Как найти версию:

Ваши файлы миграции хранятся в каталоге rails_root/db/migrate. Найдите соответствующий файл, для которого вы хотите откат, и скопируйте номер префикса.

например

имя файла: 20140208031131_create_roles.rb то версия 20140208031131

  • 5
    Самый простой способ найти идентификатор миграции - запустить rake db:migrate:status
20

Вы можете откатить миграцию, используя rake db:rollback с различными опциями. Синтаксис будет отличаться в зависимости от ваших требований.

Если вы хотите откатить только последнюю миграцию, то вы можете использовать либо

rake db:rollback

или же

rake db:rollback STEP=1

Если вы хотите откатить количество миграций за раз, тогда вы просто передаете аргумент:

rake db:rollback STEP=n

где n - количество миграций для отката, считая от последней миграции.

Если вы хотите выполнить откат к определенной миграции, вы должны передать версию миграции следующим образом:

rake db:migrate:down VERSION=xxxxx

где xxxxx - номер версии миграции.

13

Чтобы отменить последнюю миграцию, вы можете сделать:

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
12

Откат последней миграции:

# 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
6

Если это обратимая миграция и последняя, ​​которая была выполнена, запустите rake db:rollback. И вы всегда можете использовать версию. например

файл миграции - 20140716084539_create_customer_stats.rb, поэтому команда отката будет, rake db:migrate:down VERSION=20140716084539

3

Миграции изменяют состояние базы данных с помощью команды

$ bundle exec rake db:migrate

Мы можем отменить один шаг перехода, используя

  $ bundle exec rake db:rollback

Чтобы вернуться к началу, мы можем использовать

  $ bundle exec rake db:migrate VERSION=0

Как вы могли догадаться, заменяя любое другое число на 0 мигрирует на этот номер версии, где номера версий поступают из перечисления последовательностей миграции

3

Из 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 и, наконец, замена вверх и вниз. Это все позаботится о возврате.

2

Хорошо в рельсах 5 это довольно легко rake db: migrate: status или rails db: migrate: status

Он был изменен так, чтобы обрабатывать то же самое Затем просто выберите версию, которую вы хотите отменить а затем запустить rake db: migrate VERSION = 2013424230423

Убедитесь, что VERSION - это заглавные буквы

Если у вас возникли проблемы с любым шагом миграции или застряли в середине, просто перейдите в файл миграции и закомментируйте строки, которые уже были перенесены.

Надеюсь, что поможет

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

Чтобы откатить все миграции до определенной версии (например, 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

0

Если вы хотите откат и переход, вы можете запустить:

rake db:migrate:redo

То же самое, что:

rake db:rollback
rake db:migrate

Ещё вопросы

Сообщество Overcoder
Наверх
Меню