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

94

После установки 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, будет создана таблица пользователей.

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

робко
источник

Ответы:

147

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

rake db:migrate:down VERSION=<version>

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

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

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

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

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

rake db:rollback
Damienbrz
источник
65

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

  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)
Майкл Даррант
источник
5
Скатываться к конкретной версии:rake db:migrate VERSION=<version number>
Ajedi32
3
По крайней мере, для rails 3.0.20 первая команда неверна. Одиночное rake db:migrate:downпрерывание с сообщением об ошибке «Требуется ВЕРСИЯ». Однако рекомендуемый rake db:rollback вариант работает.
Мартин
Как подробно описано в ответе, Rails 2 ТОЛЬКО для первой команды.
Майкл Даррант
1
Переменные среды чувствительны к регистру, поэтому должно быть STEPиVERSION
Костас Русис 07
Чтобы уточнить, $ rake db:migrate:down VERSION=nnnне откатывается до версии, а выполняется переход на указанную версию.
johnml
15

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

rake db:rollback STEP=3

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

пьяница
источник
это более быстрый и простой способ вместо поиска номеров версий, если вы хотите отменить последние несколько миграций
Pre-alpha
11

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

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

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

вставьте VERSION для номера версии вашего файла миграции, который вы хотите вернуть.

Люк БиклTWA
источник
10
rake db:migrate:redo

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

Кенет
источник
5

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

rails db:migrate:down VERSION=<version>

пример

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

Михир Кумар Тхакур
источник
2

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

rake db:migrate:status

или

bundle exec rake db:migrate:status

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

bundle exec rake db:migrate:down VERSION=
Arun JP
источник
0

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

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

rake db:migrate:status

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

Определите миграцию для отката.

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

rake db:migrate:down VERSION=20190802023239

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

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

BKSpurgeon
источник