Як відкатати певну міграцію?


807

У мене є такий файл міграції db\migrate\20100905201547_create_blocks.rb

Як я можу конкретно відкатати цей файл міграції?


1
Чи вирішує це питання? Вам просто потрібно зробити Class.down stackoverflow.com/questions/753919/run-a-single-migration-file
— danivovich

4
— Вся

1
Ви хочете скасувати лише ту єдину конкретну міграцію (навіть якщо після неї є новіші міграції)? Або ви хочете повернути базу даних до стану, в якому вона перебувала до цієї міграції, та будь-яких подальших міграцій?
— Джон Шнайдер

Відповіді:


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

Якщо ви хочете перенести одну міграцію з ладу, є і її зворотний db:migrate:up:

rake db:migrate:up VERSION=20100905201547

14
"З метою відкату до конкретної версії" - чи не є командою, яка слідує лише за відкатом певної міграції, а не за допомогою повернення назад до цієї версії?
— Ендрю Грімм

10
"Для того, щоб скористатися певною версією ..." Ця відповідь невірна! Це дозволить повернути міграцію окремо, як пояснено іншими відповідями.
— Rhys van der Waerden

3
ПОПЕРЕДЖЕННЯ: я допустив цю помилку: використовуйте лише rake db: migrate: down VERSION = 20100905201547 для відкату В ІЗОЛАЦІЇ !!! один файл міграції. Про це йдеться у коментарі вище, але я його пропустив.
— пікселеарт

3
Ще одне слово попередження - ніколи не роби цього STEP=-1. Я зробив це один раз, і він зійшов з розуму, відкотивши все. Не гарно! Це був Rails 4.2 - я думаю, це можливо вже виправлено.
— Дейв Хартнолл

1
Написав у моєму блозі статтю про міграції, в якій пояснюється, як і коли використовувати ці команди: railsguides.net/polish-rails-migrations
— ka8725

867
rake db:migrate:down VERSION=20100905201547

відновить конкретний файл.


Щоб знайти версію всіх міграцій, ви можете скористатися цією командою:

rake db:migrate:status

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


Дивіться в посібнику про міграції Ruby on Rails .


48
Однозначно краща відповідь на мій погляд.
— streetlogics

30
Варто згадати, що якщо ви скачуєте певну міграцію та не хочете, щоб вона повторно мігрувала під час майбутніх завдань на граблі, тоді також видаліть файл міграції.
— BradGreens

4
Примітка: схоже, що якщо міграція вгору ніколи не була успішною, а була лише частково виконана, спад не робить нічого.
— cyrilchampier

1
@nerith, ймовірно, це стосується лише баз даних, які не підтримують транзакційний DDL. MySQL не підтримує транзакційний DDL: dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html PostreSQL робить: wiki.postgresql.org/wiki/… Отже, якщо ваша міграція в базі даних MySQL порушена тоді ви можете вручну видалити частину успішної міграції.
— Иван Бишевац

1
Ще одне зауваження щодо коментаря @BradGreens Якщо ви хочете видалити файл міграції, і він уже розгорнутий, ви захочете відмовити виробництво / постановку, перш ніж зробити код із видаленим файлом. В іншому випадку ви не зможете відкати / мігрувати: вниз.
— AdamT

57

Для відкату останньої міграції ви можете:

rake db:rollback

Якщо ви хочете відкатати певну міграцію з версією, вам слід зробити:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Наприклад, якщо версія 20141201122027, ви зробите:

rake db:migrate:down VERSION=20141201122027

відкинути цю конкретну міграцію.


32

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

Якщо ви хочете відкатати лише останню міграцію, ви можете використовувати будь-яку

rake db:rollback

або

rake db:rollback STEP=1

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

rake db:rollback STEP=n

де nкількість міграцій до відкату, рахуючи від останньої міграції.

Якщо ви хочете відкатати певну міграцію, вам слід передати версію міграції наступним чином:

rake db:migrate:down VERSION=xxxxx

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


1
додавши: вниз не працює,
— правдива

26

rake db:migrate:down VERSION=your_migrations's_version_number_here

Версія - це числовий префікс на ім'я файлу міграції

Як знайти версію :

Ваші файли міграції зберігаються у вашому rails_root/db/migrateкаталозі. Знайдіть відповідний файл, до якого потрібно відкатати, і скопіюйте номер префікса.

наприклад

ім'я файлу: 20140208031131_create_roles.rb тоді версія20140208031131


6
Найпростіший спосіб знайти ідентифікатор міграції - це запуститиrake db:migrate:status
— Aeradriel

18

Відмова від останньої міграції:

# 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

14

Для відкату останньої міграції ви можете:

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

6

Якщо це оборотна міграція та остання виконана, то запустіть rake db:rollback. І ви завжди можете використовувати версію. напр

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


6

Щоб повернути всі міграції до певної версії (наприклад 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-migramigra


4

З посібника по рейках

Повернення попередніх міграцій

Ви можете використовувати здатність 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 та reverseble, заміна create_table drop_table і, нарешті, заміна вниз та навпаки. Це все переймається ревертом.


3

Міграції змінюють стан бази даних за допомогою команди

$ bundle exec rake db:migrate

Ми можемо скасувати один крок міграції, використовуючи

  $ bundle exec rake db:rollback

Щоб пройти весь шлях до початку, ми можемо скористатися

  $ bundle exec rake db:migrate VERSION=0

Як ви могли здогадатися, заміщення будь-якого іншого числа на 0 мігрує на цей номер версії, де номери версій походять від переліку міграцій послідовно


2

Добре в рейках 5 це дуже просто рейка db: migrate: статус або rails db: migrate: status

Він був модифікований для обробки обох однаково. Потім просто виберіть версію, яку ви хочете відкотити, а потім запустіть rake db: migrate VERSION = 2013424230423

Переконайтесь, що VERSION - усі великі літери

Якщо у вас є проблема з будь-яким кроком міграції або застряг у середині, просто перейдіть до файла міграції та прокоментуйте рядки, які вже були переміщені.

Сподіваюся, що це допомагає


1
Я підкреслюю підказку для команди rake db: migrate: status . . . Це чудово для огляду, щоб побачити поточний стан виконання файлів міграції.
— Краса

1

Якщо ви хочете відкатати та перемістити, можете запустити:

rake db:migrate:redo

Це те саме, що:

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