Возможно ли иметь такое же имя индекса в базе данных sqlite?

У меня есть приложение Ruby on Rails, а база данных разработки находится в Mysql. Я решил использовать для тестирования базу данных sqlite. Для этого я сделал следующее:

  1. Настроен файл database.yml для поддержки test.sqlite3 для среды тестирования

  2. Сделал дамп текущей схемы базы данных разработки, используя rake db:schema:dump

  3. Пытался использовать 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) . Есть выход?


person Sriharsha    schedule 14.09.2015    source источник


Ответы (1)


Вы пытаетесь добавить индекс, который уже существует в вашей тестовой базе данных. Таким образом, индекс assign_id уже существует в таблице пациентов вашей тестовой базы данных. Вы можете попробовать RAILS_ENV = test rake db: drop db: create db: test: clone, и он должен работать нормально. Тем не менее, я люблю добавлять в свои миграции условные обозначения, чтобы избежать проблем. Например:

add_column :patients, :appointment_id, :integer unless column_exists? :patients, :appointment_id

Пожалуйста, во имя всего святого, не переименовывайте столбцы prod в pappointment_id или что-нибудь в этом роде.

person ruby_newbie    schedule 14.09.2015