У меня есть приложение Ruby on Rails, а база данных разработки находится в Mysql. Я решил использовать для тестирования базу данных sqlite. Для этого я сделал следующее:
Настроен файл database.yml для поддержки test.sqlite3 для среды тестирования
Сделал дамп текущей схемы базы данных разработки, используя
rake db:schema:dump
- Пытался использовать schema.rb для создания таблиц в файле базы данных test.sqlite3 с помощью команды.
rake db:test:clone
Потом все пошло вверх. У меня есть исключение
SQLite3::SQLException index XXX
already exists:CREATE INDEX "XXX" ON table ("XXX")
Когда я внимательно изучил файлы и схему миграции, я понял, что одно и то же имя индекса используется более чем в одной таблице. Например, некоторые операторы в schema.rb выглядят так:
add_index("patients", ["appointment_id"], {:name=>"appointment_id"})
add_index("doctors", ["appointment_id"], {:name=>"appointment_id"})
Я знаю, что mysql поддерживает уникальность имени индекса в пределах таблицы. Теперь простым решением может быть возврат к mysql для тестовой базы данных. Я не могу понять, возможно ли вообще сгенерировать файл sqlite из schema.rb в этом конкретном случае.
А теперь самое странное. Я внес следующие изменения и протестировал в фиктивном приложении.
add_index("patients", ["appointment_id"], {:name=>"pappointment_id"})
add_index("doctors", ["appointment_id"], {:name=>"dappointment_id"})
Это сработало! Теперь у меня может возникнуть соблазн сделать то же самое в моем реальном приложении. Суровая реальность заключается в том, что есть много мест, где мне нужно будет переименовать, и в производстве это будет более чем утомительная задача, поскольку у нас есть миллион записей, которые пострадают, если я отброшу старые индексы и добавлю новые (Mysql 5.5) . Есть выход?