Ruby on Rails: как отменить миграцию с помощью rake db: migrate?

После установки devise MODEL User я получил это.

class DeviseCreateUsers < ActiveRecord::Migration
  def self.up
    create_table(:users) do |t|
      t.database_authenticatable :null => false
      t.recoverable
      t.rememberable
      t.trackable

      # t.encryptable
      # t.confirmable
      # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
      # t.token_authenticatable


      t.timestamps
    end

    add_index :users, :email,                :unique => true
    add_index :users, :reset_password_token, :unique => true
    # add_index :users, :confirmation_token,   :unique => true
    # add_index :users, :unlock_token,         :unique => true
    # add_index :users, :authentication_token, :unique => true
  end

  def self.down
    drop_table :users
  end
end

Теперь, если я сделаю rake db: migrate, будет создана таблица пользователей.

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


person shibly    schedule 08.10.2011    source источник


Ответы (9)


Выполните следующую команду

rake db:migrate:down VERSION=<version>

где <version> - номер версии вашего файла миграции, который вы хотите восстановить.

например. если вы хотите отменить миграцию с именем файла 3846656238_create_users.rb

rake db: migrate: down ВЕРСИЯ = 3846656238

person Mahesh    schedule 08.10.2011
comment
Я получаю UnknownMigrationVersionError, но я понял, что это потому, что мои миграции находятся внутри db/migrate/main, знает ли кто-нибудь обходной путь, чтобы db:migrate:down заглядывал внутрь этого конкретного каталога или подкаталогов миграции? - person tf.rz; 28.03.2016
comment
Это только для рельсов 3 и выше. Моя жизнь в рельсах 2. Так грустно - person morhook; 02.11.2018
comment
@morhook Это также работает для рельсов 3. Проверьте документы здесь guides.rubyonrails.org/v3.2/migrations.html - person Mahesh; 11.02.2019
comment
Ты прав! Он работает как для направляющих 2, так и для направляющих 3. Спасибо @Mahesh за ваш вклад! - person morhook; 06.03.2019

Просто запустите эту команду:

rake db:rollback
person damienbrz    schedule 08.10.2011

Я считаю, что есть три варианта возврата к миграции (они также перекрываются):

  1. Сверните самую последнюю миграцию:

    rake db:migrate:down # Только Rails 2.

  2. Сверните количество (n) из недавних миграций:

    rake db:rollback STEP=n

  3. Откатитесь до предыдущей, конкретной версии:

    $ rake db:migrate:down VERSION=nnn # Rails 3 (укажите также номер версии).

Номер версии означает SHA (алгоритм безопасного хеширования) для фиксации, который представляет собой длинное шестнадцатеричное число, которое выглядит примерно как 886af3194768917c78e ... Вы можете увидеть это, выполнив git log

Вы можете увидеть эти (и другие) команды с их описанием, используя rake -T db:, который для rails 3.2 включает:

rake db:migrate         # Migrate the database (options: VERSION=x, VERBOSE=false)
rake db:migrate:status  # Display status of migrations
rake db:rollback        # Rolls the schema back to the previous version (specify steps w/ STEP=n)
person Michael Durrant    schedule 08.10.2011
comment
Сверните до определенной версии: rake db:migrate VERSION=<version number> - person Ajedi32; 03.06.2013
comment
По крайней мере, для rails 3.0.20 первая команда неверна. Требуется один rake db:migrate:down прерывание с сообщением об ошибке ВЕРСИЯ. Однако рекомендованный rake db:rollback работает. - person martin; 19.06.2013
comment
Как подробно описано в ответе, Rails 2 ТОЛЬКО для первой команды. - person Michael Durrant; 07.07.2014
comment
Переменные среды чувствительны к регистру, поэтому должны быть STEP и VERSION. - person Kostas Rousis; 07.07.2014
comment
Чтобы уточнить, $ rake db:migrate:down VERSION=nnn не откатывается до версии, он мигрирует до указанной версии. - person johnml; 15.07.2016

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

rake db:rollback STEP=3

за 3 последних миграции.

person bender    schedule 08.10.2011
comment
это более быстрый и простой способ вместо поиска номеров версий, если вы хотите отменить последние несколько миграций - person Pre-alpha; 31.03.2017

Как новый программист (или другим новым программистам)

rake db:rollback работает примерно в половине случаев. Я начинаю там.

Если нет, rake db:migrate:down VERSION=3846656238

вставьте ВЕРСИЯ для номера версии вашего файла миграции, который вы хотите восстановить.

person LukeBickleTWA    schedule 10.02.2015

rake db:migrate:redo

Это отменит и повторно применит последнюю миграцию.

person keneth    schedule 06.06.2014

Для рельсов 5 можно использовать rails command instead of rake

rails db:migrate:down VERSION=<version>

пример

rails db: migrate: down ВЕРСИЯ = 20170330090327

person Mihir Kumar Thakur    schedule 31.03.2017

Запустите эту команду в своем терминале:

rake db:migrate:status

or

bundle exec rake db:migrate:status

Он показывает статус, идентификаторы миграции, имя миграции для всех ранее выполненных миграций. выберите свой идентификатор миграции (т.е. номер версии) и введите этот идентификатор в следующую команду после version = ,,, и нажмите ввод

bundle exec rake db:migrate:down VERSION=
person Arun JP    schedule 09.08.2016

Как откатить миграцию

(1) Сначала определите идентификатор миграции

rake db:migrate:status

  • Скопируйте идентификационный номер.

Определите перенос для отката.

(2) Затем откатите миграцию

rake db:migrate:down VERSION=20190802023239

  • Вставьте соответствующий идентификационный номер выше. Конечно, в вашем случае идентификатор миграции будет другим! Используйте правильный идентификатор миграции.

....... и теперь ты на скачки!

person BKSpurgeon    schedule 02.08.2019