У мене є такий файл міграції db\migrate\20100905201547_create_blocks.rb
Як я можу конкретно відкатати цей файл міграції?
У мене є такий файл міграції db\migrate\20100905201547_create_blocks.rb
Як я можу конкретно відкатати цей файл міграції?
Відповіді:
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
STEP=-1
. Я зробив це один раз, і він зійшов з розуму, відкотивши все. Не гарно! Це був Rails 4.2 - я думаю, це можливо вже виправлено.
rake db:migrate:down VERSION=20100905201547
відновить конкретний файл.
Щоб знайти версію всіх міграцій, ви можете скористатися цією командою:
rake db:migrate:status
Або просто префікс імені файлу міграції - це версія, яку потрібно відкатати.
Дивіться в посібнику про міграції Ruby on Rails .
Для відкату останньої міграції ви можете:
rake db:rollback
Якщо ви хочете відкатати певну міграцію з версією, вам слід зробити:
rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION
Наприклад, якщо версія 20141201122027, ви зробите:
rake db:migrate:down VERSION=20141201122027
відкинути цю конкретну міграцію.
Ви можете відкатати міграцію, використовуючи rake db:rollback
різні варіанти. Синтаксис буде відрізнятися відповідно до ваших вимог.
Якщо ви хочете відкатати лише останню міграцію, ви можете використовувати будь-яку
rake db:rollback
або
rake db:rollback STEP=1
Якщо ви хочете отримати кількість міграцій відката відразу, ви просто передаєте аргумент:
rake db:rollback STEP=n
де n
кількість міграцій до відкату, рахуючи від останньої міграції.
Якщо ви хочете відкатати певну міграцію, вам слід передати версію міграції наступним чином:
rake db:migrate:down VERSION=xxxxx
де xxxxx - номер версії міграції.
rake db:migrate:down VERSION=your_migrations's_version_number_here
Версія - це числовий префікс на ім'я файлу міграції
Як знайти версію :
Ваші файли міграції зберігаються у вашому rails_root/db/migrate
каталозі. Знайдіть відповідний файл, до якого потрібно відкатати, і скопіюйте номер префікса.
наприклад
ім'я файлу: 20140208031131_create_roles.rb
тоді версія20140208031131
rake db:migrate:status
Відмова від останньої міграції:
# 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
Для відкату останньої міграції ви можете:
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
Щоб повернути всі міграції до певної версії (наприклад 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
Ви можете використовувати здатність 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 і, нарешті, заміна вниз та навпаки. Це все переймається ревертом.
Міграції змінюють стан бази даних за допомогою команди
$ bundle exec rake db:migrate
Ми можемо скасувати один крок міграції, використовуючи
$ bundle exec rake db:rollback
Щоб пройти весь шлях до початку, ми можемо скористатися
$ bundle exec rake db:migrate VERSION=0
Як ви могли здогадатися, заміщення будь-якого іншого числа на 0 мігрує на цей номер версії, де номери версій походять від переліку міграцій послідовно
Добре в рейках 5 це дуже просто рейка db: migrate: статус або rails db: migrate: status
Він був модифікований для обробки обох однаково. Потім просто виберіть версію, яку ви хочете відкотити, а потім запустіть rake db: migrate VERSION = 2013424230423
Переконайтесь, що VERSION - усі великі літери
Якщо у вас є проблема з будь-яким кроком міграції або застряг у середині, просто перейдіть до файла міграції та прокоментуйте рядки, які вже були переміщені.
Сподіваюся, що це допомагає
Class.down
stackoverflow.com/questions/753919/run-a-single-migration-file