кажется, что рельсы воспроизводят миграцию

когда я создал новую миграцию и запустил ее, произошла ошибка:

$ rake db: миграция
== CreateEReadings: миграция ===================================== ===========
- создание_таблицы (: e_readings) прервано! Произошла ошибка, эта и все последующие миграции отменены:

SQLite3 :: SQLException: таблица "e_readings" уже существует

в то время как этот e_readings - последняя таблица, которую я создал с помощью миграции.

Имя файла миграции: 20120508145115_create_e_readings.rb

а версия в db / schema.rb:

: версия => 20120508145115

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


person DiveInto    schedule 16.06.2012    source источник


Ответы (3)


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

Если это просто среда разработки, и вы не возражаете против ее взорвать, вы также можете запустить rake db:reset, и он будет отбрасывать, создавать, загружать схему и повторно загружать ее.

person Peter Brown    schedule 16.06.2012
comment
спасибо, а для чего в схеме используется: version = ›20120508145115? Кажется, что рельсы выполняют миграцию в соответствии с записью в таблице schema_migrations, так что это: version = ›20120508145115 избыточно? - person DiveInto; 17.06.2012

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

person Andrew    schedule 16.06.2012

Я согласен и с Бирлингтоном, и с Энди. Если это среда разработки, попробуйте в терминале следующее:

rake db:drop
rake db:create
rake db:migrate

Это уничтожит вашу базу данных, создаст ее заново и запустит все ваши миграции.

Еще вы можете попробовать выполнить откат с помощью rake db:rollback, пока не увидите, что эта миграция (или предыдущая) была отменена, а затем запустите rake db:migrate, чтобы снова запустить ее с этой точки до последней точки. rake db:rollback выполняет откат по одному файлу миграции за раз.

Я бы пошел с дропом и воссоздал, просто чтобы убедиться, что ничего смешного не осталось.

Надеюсь это поможет.

person Theo Scholiadis    schedule 16.06.2012