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


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.