Rails: как откат неудачной миграции

Я идиот... вкрутил миграцию в Rails:

Мыслительные миграции будут работать как генераторы моделей (используя references:modelname). Я сделал следующее:

$ rails g migration add_event_to_photos references:event

который создал миграцию

class AddEventToPhotos < ActiveRecord::Migration
  def change
    add_column :photos, :references, :event
  end
end

И теперь моя база данных разработки (SQLite3) имеет столбец references типа event в таблице photos.

И мой schema.rb имеет строку в середине:

# Could not dump table "photos" because of following StandardError
#   Unknown type 'event' for column 'references'

rake db:rollback бессилен против этого:

$ rake db:rollback
==  AddEventToPhotos: reverting ===============================================
-- remove_column("photos", :references)
rake aborted!
An error has occurred, this and all later migrations canceled:

undefined method `to_sym' for nil:NilClass

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


btw- для тех, кто читает это, чтобы сделать ту же самую глупую ошибку... не надо! Используйте правильный генератор миграции:

$ rails g migration add_event_to_photos event_id:integer

Ответы

Ответ 1

Самый простой способ, который я нашел для этого, - воссоздать таблицу в файле schema.rb в /db/. Впоследствии я запустил rake db:reset (если он говорит, что у вас есть ожидающие миграции, просто удалите их и повторите попытку).

Это позаботилось о проблеме.

Ответ 2

Перейдите в базу данных ./script/rails dbconsole. Затем введите следующие команды:

.output dump.sql
.dump

В файле dump.sql у вас будут команды SQL, используемые для воссоздания и заполнения вашей базы данных. Просто отредактируйте его в своем любимом редакторе (например, vim;-) удалите или исправьте тип столбца. Вы также можете удалить недопустимый идентификатор миграции из таблицы schema_migrations. Бросьте свою базу данных (я предлагаю просто переименовать файл db/development.sqlite), создайте новую базу данных и прочитайте файл дампа в нем (используя команду .read dump.sql).

Теперь вам нужно только исправить и запустить свои миграции.

Ответ 3

добавить пустой метод и запустить rake db: rollback

отредактируйте ahh, что новый синтаксис миграции, вы можете просто заменить тело:

def self.down; end

который является старым синтаксисом или, возможно, вообще удаляет тело (не пробовал это), а затем запустил rake db:rollback

Ответ 4

Просто идея, я знаю, что это не спецификация SQLite, вы можете вернуться к старой схеме, возможно, загрузите ее. И попробовать еще раз оттуда? Вы можете вернуть (checkout) определенные файлы в GIT. А затем сделайте def self.down; end, как было предложено другим плакатом.

Ответ 5

Проблема возникает из-за того, что в то время как SQLite создаст схему с любым типом, который вы ей даете (в этом случае event он не может вернуть этот тип в ActiveRecord.

Вам нужно отредактировать файл sqlite_master и изменить строку create table (sql), чтобы быть правильной.

Скорее всего, вы захотите создать резервную копию своей таблицы, поскольку испортить эту строку приведет к повреждению вашей таблицы, если вы сделаете это неправильно.

Вот связанная проблема с рельсами