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: буде створено таблицю користувачів.

Як я можу повернути цю міграцію, тобто як я можу знову видалити таблицю користувачів за допомогою rake?

Відповіді:


147

Виконайте наступну команду

rake db:migrate:down VERSION=<version>

де <version>номер версії вашого файлу міграції, який потрібно повернути.

напр. якщо ви хочете повернути міграцію з іменем файлу 3846656238_create_users.rb

rake db: migrate: down VERSION = 3846656238


Я отримую, UnknownMigrationVersionErrorале я зрозумів, що це пов’язано з тим, що мої міграції знаходяться всередині db/migrate/main, чи знає хтось обхідний шлях для того, щоб db:migrate:downзаглянути всередину цього конкретного каталогу або підкаталогів міграції?
tf.rz

Це лише для рейок 3 і далі. Моє життя в рейки 2. Так сумно
morhook

@morhook Це також працює для рейок 3. Перегляньте документи тут guides.rubyonrails.org/v3.2/migrations.html
Махеш

Ти правий! Це працює як для рейок 2, так і для рейок 3. Дякую @Mahesh за ваш внесок!
morhook


65

Я вважаю, що доступні три варіанти відновлення міграції (вони також збігаються):

  1. Згорніть останню міграцію:

    rake db:migrate:down # Тільки рейки 2.

  2. Згорніть кількість (n) останніх міграцій:

    rake db:rollback STEP=n

  3. Перейдіть до попередньої, конкретної версії:

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

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

Ви можете побачити ці команди (та інші) з їх описом, використовуючи rake -T db:які для рейок 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
Принаймні для рейок 3.0.20 перша команда неправильна. Одиночний rake db:migrate:downаборт із повідомленням про помилку "ВЕРСІЯ потрібна". Рекомендується rake db:rollback , однак працює.
Мартін

Як детально зазначено у відповіді, Rails 2 ТІЛЬКИ для першого наказу.
Michael Durrant

1
Змінні середовища чутливі до регістру, тому це повинно бути STEPіVERSION
Костас Русіс

Для уточнення, $ 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 до номера версії вашого файлу міграції, який потрібно повернути.



5

Для рейок 5 ми можемо використовувати rails command instead of rake

rails db:migrate:down VERSION=<version>

приклад

rails db: migrate: down VERSION = 20170330090327


2

Запустіть цю команду у своєму терміналі:

rake db:migrate:status

або

bundle exec rake db:migrate:status

Він показує статус, ідентифікаційні дані міграції, ім’я міграції для всіх перенесених раніше міграцій. виберіть свій ідентифікатор міграції (тобто номер вашої версії) і поставте цей ідентифікатор у наступну команду після версії = ,,, та натисніть клавішу enter

bundle exec rake db:migrate:down VERSION=

0

Як відкотити міграцію

(1) Спочатку визначте ідентифікаційний номер міграції

rake db:migrate:status

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

Визначте міграцію для відкочування.

(2) Потім відкотіть міграцію

rake db:migrate:down VERSION=20190802023239

  • Вставте відповідний ідентифікаційний номер вище. Звичайно, у вашому випадку ідентифікатор міграції буде іншим! Використовуйте правильний ідентифікатор міграції.

....... і тепер ви вирушаєте на перегони!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.