Как откатить конкретную миграцию? - PullRequest
724 голосов
/ 06 сентября 2010

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

Как конкретно откатить этот файл миграции?

Ответы [ 13 ]

1166 голосов
/ 06 сентября 2010
rake db:rollback STEP=1

Это способ сделать это, если миграция, которую вы хотите откатить, является последней примененной. Вы можете заменить 1 тем количеством миграций, которое хотите вернуться.

Например:

rake db:rollback STEP=5

Откатит также всю перенесенную миграцию (4, 3, 2, а также 1).

Чтобы откатить все миграции обратно (и включая) целевую миграцию, используйте: (Эта исправленная команда была добавлена ​​ПОСЛЕ всех комментариев, указывающих на ошибку в исходном сообщении)

rake db:migrate VERSION=20100905201547

Чтобы откатить ТОЛЬКО ОДНУ конкретную миграцию (ИЗ ЗАКАЗА), используйте:

rake db:migrate:down VERSION=20100905201547

Обратите внимание, что это НЕ позволит откатить любые промежуточные миграции - только тот, который указан. Если это не то, что вы намеревались, вы можете безопасно запустить rake db:migrate, и он будет перезапущен только тот, пропуская другие, которые ранее не были откатаны.

834 голосов
/ 09 июля 2011
rake db:migrate:down VERSION=20100905201547

откатит указанный файл.


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

rake db:migrate:status

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


См. справочник Ruby on Rails по миграциям.

49 голосов
/ 02 декабря 2014

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

rake db:rollback

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

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

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

rake db:migrate:down VERSION=20141201122027

для отката этой конкретной миграции.

25 голосов
/ 24 марта 2014

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

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

rake db:rollback

или

rake db:rollback STEP=1

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

rake db:rollback STEP=n

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

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

rake db:migrate:down VERSION=xxxxx

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

24 голосов
/ 22 апреля 2014

rake db:migrate:down VERSION=your_migrations's_version_number_here

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

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

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

, например

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

14 голосов
/ 20 сентября 2016

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

# 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
13 голосов
/ 06 января 2015

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

rake db:rollback

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

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Если файл миграции, который вы хотите откатить, назывался db/migrate/20141201122027_create_some_table.rb, тогда ВЕРСИЯ для этой миграции - 20141201122027, которая является отметкой времени создания этой миграции, и команда для отката этой миграции будет выглядеть так:

rake db:migrate:down VERSION=20141201122027
6 голосов
/ 28 июля 2014

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

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

3 голосов
/ 06 мая 2016

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

$ bundle exec rake db:migrate

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

  $ bundle exec rake db:rollback

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

  $ bundle exec rake db:migrate VERSION=0

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

3 голосов
/ 29 июня 2015

Из Руководство по Rails

Восстановление предыдущих миграций

Вы можете использовать способность 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 и наоборот.Об этом все позаботится, вернувшись.

...