Rails: как откатить неудачную миграцию - PullRequest
14 голосов
/ 11 августа 2011

Я идиот ... облажался с миграцией в 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

Ответы [ 5 ]

6 голосов
/ 30 августа 2012

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

Это решило проблему.

3 голосов
/ 11 августа 2011

Зайдите в базу данных по ./script/rails dbconsole.Затем введите эти команды:

.output dump.sql
.dump

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

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

2 голосов
/ 11 августа 2011

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

изменить ахх, это новый синтаксис миграции, вы можете заменить тело на:

def self.down; end

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

0 голосов
/ 03 января 2012

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

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

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

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

0 голосов
/ 23 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...