Как удалить файлы миграции в Rails 3

109

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

Кроме того, следует ли мне сделать db:resetили db:dropудалить / удалить миграцию?

alvincrespo
источник

Ответы:

142

Я обычно:

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

Если ваше приложение уже находится в рабочей или промежуточной среде, безопаснее просто написать еще одну миграцию, которая уничтожит вашу таблицу или столбцы.

Еще один отличный справочник по миграции: http://guides.rubyonrails.org/migrations.html

Фабио Батиста
источник
2
Будет ли удаление миграции и последующий запуск db: migrate уничтожить созданную таблицу?
alvincrespo 07
2
Нет, поскольку Rails не знает, как его удалить. Он должен вызвать self.downметод, определенный при миграции, для «понижения» вашей базы данных.
Фабио Батиста,
35
Если вы уже удалили файл, не понимая, что рельсы так легко не отпустят, rake db:migrate:statusпокажет вам идентификатор отсутствующего файла, который вы можете использовать для его воссоздания. Как только он вернется, вы сможете следовать совету этого ответа до победы.
Jordan Feldstein
1
@JordanFeldstein, спасибо. db:migrate:statusспасает жизнь!
dee
1
@Lucas, после удаления файла миграции его уже нельзя будет отменить. Вот почему вы должны вернуть его во всех средах, которые он уже запускал (производство, разработка, тестирование, постановка и т. Д.), Прежде чем удалять его файл. Вот почему я написал, что безопаснее просто создать еще одну миграцию, чтобы вернуть старую, когда она уже запущена в производственной среде.
Фабио Батиста
68

Другой способ удалить миграцию:

$ rails d migration SameMigrationNameAsUsedToGenerate

Используйте его до rake db:migrateвыполнения, потому что изменения в базе данных останутся навсегда :) - или удалите изменения вручную

Гедиминас
источник
3
«Если ваше приложение уже находится в рабочей или промежуточной среде, безопаснее просто написать еще одну миграцию, которая уничтожит вашу таблицу или столбцы». Так что изменения не остаются в базе данных навсегда
JohnMerlino
8
Кстати, «д» означает «уничтожить».
Greg M. Krsak
21

Выполните следующие команды из домашнего каталога приложения:

  1. rake db:migrate:down VERSION="20140311142212" (здесь версия - это временная метка, добавленная рельсами при создании миграции. Это действие вернет изменения БД из-за этой миграции)

  2. Run "rails destroy migration migration_name"(имя_играции - это то, что было выбрано при создании миграции. Удалите отметку времени Чтобы получить ее, из имени файла миграции)

лиса
источник
rake destroy миграция AddFileToTable rake прервана! Не знаю, как создать задачу «уничтожить» (см. Полную трассировку, запустив задачу с параметром --trace)
sadaf2605
3
Для № 2 правильная команда:rails d migration migration_name
mauriciomdea
1
Спасибо за подсказку «удалить отметку времени_», это то, что мне было нужно
LightMan
10

Вы также можете запустить миграцию вниз следующим образом:

rake db:migrate:down VERSION=versionnumber

Обратитесь к руководству Ruby on Rails по миграции для получения дополнительной информации.

Vicky
источник
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 
random_user_0891
источник
1

Ни один из этих ответов не соответствует моей проблеме, поскольку миграция, которую я хотел удалить, отсутствовала: я создал и запустил миграцию в какой-то другой ветке, которая затем была отброшена. Проблема в том, что когда выполняется миграция, rails добавляет версию в schema_migrationsтаблицу в базе данных. Поэтому, даже если он не указан в вашей структуре или схеме базы данных, rails ищет его. Вы можете выявить эти потерянные миграции, запустив:

rails db:migrate:status

Обратите внимание на версии отсутствующих миграций и перейдите в консоль db:

rails dbconsole

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

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

Теперь ты должен быть в порядке.

stackPusher
источник
0

У меня была такая же проблема:

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

Это исправило это для меня

Мигель Алаторре
источник
0

Боковое примечание: Начиная с рельсов 5.0.0 rakeбыло изменено на rails Поэтому выполните следующие действия.

rails db: migrate VERSION = 0

Мохамед Доу
источник