Як видалити файли міграції в 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.