Як видалити файли міграції в Rails 3


109

Я хотів би видалити / видалити файл міграції. Як би я пішов робити це? Я знаю, що тут є подібні запитання, але як оновлення, чи є кращий спосіб, ніж робити сценарій / знищувати?

Крім того, чи слід робити db:resetчи db:dropвидалити / видалити міграцію?

Відповіді:


142

Я зазвичай:

  1. Виконайте в rake db:migrate VERSION=XXXусіх середовищах, до версії до тієї, яку я хочу видалити.
  2. Видаліть файл міграції вручну.
  3. Якщо є міграції, що очікують на розгляд (тобто міграція, яку я видалив, була не останньою), я просто rake db:migrateзнову виконую новий .

Якщо ваша заявка вже на виробництві або на етапі постановки, безпечніше просто написати іншу міграцію, яка знищує вашу таблицю або стовпці.

Ще одна велика довідка щодо міграцій: http://guides.rubyonrails.org/migrations.html


2
Чи видалить міграцію, а потім запустить db: migrate стерти створену таблицю?
— alvincrespo

2
Ні, оскільки Rails не знає, як її видалити. Потрібно викликати self.downметод, визначений під час вашої міграції, щоб "знизити" вашу базу даних.
— Фабіо Батіста

35
Якщо ви вже видалили файл, не розуміючи, що рейки не відпустять це легко, rake db:migrate:statusпокаже вам ідентифікатор відсутнього файлу, який ви можете використовувати для його відтворення. Після повернення ви можете дотримуватися порад цієї відповіді до перемоги.
— Йордан Фельдштейн

1
@JordanFeldstein, дякую. db:migrate:statusце рятувальник життя!
— дев

1
@Lucas, коли файл міграції буде видалено, його більше не можна повернути. Ось чому ви повинні повернути його у всіх середовищах, у яких він вже працював (виробництво, розробка, тестування, постановка тощо), перш ніж видаляти його файл. Ось чому я написав, що безпечніше просто створити іншу міграцію, щоб відновити цю стару, як тільки вона вже працює на виробництві.
— Фабіо Батіста

68

Ще один спосіб видалення міграції:

$ rails d migration SameMigrationNameAsUsedToGenerate

Використовуйте його до того, як rake db:migrateбуде виконано, оскільки зміни в базі даних залишаться назавжди :) - або видаліть зміни вручну


3
"Якщо ваша заявка вже на виробництві або на етапі постановки, безпечніше просто написати іншу міграцію, яка знищує вашу таблицю або стовпці." Тож зміни не залишаються назавжди в базі даних
— JohnMerlino

8
До речі, "d" означає "знищити".
— Грег М. Крсак

21

Виконайте команди нижче з домашнього каталогу програми:

  1. rake db:migrate:down VERSION="20140311142212" (тут версія - це часова мітка, попереджена рейками під час створення міграції. Ця дія відновить зміни БД через цю міграцію)

  2. Run "rails destroy migration migration_name"(ім'я міграції - це одне використання, яке було вибрано під час створення міграції. Видаліть " timetamp_ " із імені файлу міграції, щоб отримати його


граблі знищити міграцію Граблі AddFileToTable перервано! Не знаєте, як скласти завдання "знищити" (Дивіться повний слід, виконуючи завдання з --trace)
— sadaf2605

3
Для №2 правильна команда:rails d migration migration_name
— mauriciomdea

1
Дякую за підказку "
— Remove

10

Ви також можете запустити міграцію вниз таким чином:

rake db:migrate:down VERSION=versionnumber

Докладнішу інформацію див. У посібнику про міграції Ruby on Rails .


9

Ми можемо використовувати,

$ rails d migration table_name  

Що видалить міграцію.


1
Я думаю, що це має бути назва моделі, а не table_name
— Ajeet Khan

3

Іноді я виявляв, що видаляє файл міграції, а потім видаляє відповідний запис у таблиці schema_migrations з бази даних. Не дуже, але це працює.


3

Це також працює в Rails 5.

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

rake db:rollback

потім видаліть сам файл міграції, запустивши:

rails d migration WhateverYourMigrationWasNamed.rb 


1

Жодна з цих відповідей не відповідала проблемі, яку я не мав, оскільки міграції, яку я хотів видалити, не було: я створив і запустив міграцію в іншій гілці, яку потім було відмінено. Проблема полягає в тому, що коли виконується міграція, rails додає версію до schema_migrationsтаблиці в базі даних. Тож навіть якщо він не вказаний у вашій структурі db або схемі, рейки шукають це. Ви можете виявити ці сирітські міграції, запустивши:

rails db:migrate:status

Зверніть увагу на версії відсутніх міграцій та перейдіть до консолі db:

rails dbconsole

Тепер видаліть версії з таблиці міграції вручну:

delete from schema_migrations where version='<version>';

Тепер ти повинен бути хорошим.


0

У мене просто була така ж проблема:

  1. rails d migration fuu - це видалено міграцію з останньою міткою часу
  2. rails d міграція fuu - це видалено іншу міграцію
  3. скористайтеся статусом git, щоб перевірити, чи немає у файлах, що не відстежуються, більше
  4. рейки g міграції fuu

Це зафіксувало мене


0

Бічна примітка: Починаючи з рейок 5.0.0 rakeбуло змінено наrails Так виконайте наступне

rails db: міграція VERSION = 0

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