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
), чтобы быть правильной.
Скорее всего, вы захотите создать резервную копию своей таблицы, поскольку испортить эту строку приведет к повреждению вашей таблицы, если вы сделаете это неправильно.
Вот связанная проблема с рельсами