¿Cómo resuelvo que "index unique_schema_migrations ya existe" en Rails?

Ejecutar rake db: migrate seguido de rake test: units produce lo siguiente:

rake test:functionals
(in /projects/my_project)
rake aborted!
SQLite3::SQLException: index unique_schema_migrations already exists: CREATE UNIQUE INDEX "unique_schema_migrations" ON "ts_schema_migrations" ("version")

La parte relevante de db/schema.rb es la siguiente:

create_table "ts_schema_migrations", :id => false, :force => true do |t|
  t.string "version", :null => false
end

add_index "ts_schema_migrations", ["version"], :name => "unique_schema_migrations", :unique => true

No estoy cambiando manualmente este índice en ninguna parte, y estoy usando el adaptador SQLite3 predeterminado de Rails con una base de datos completamente nueva. (Es decir, ejecutar rm db/* sqlite3 antes de rake db: migrate no ayuda.)

¿Está la tarea de test: units quizás intentando volver a cargar el esquema? Si es así, ¿por qué? ¿No debería reconocer que el esquema ya está actualizado?

4
Definitivamente no hay otras declaraciones de índice para la tabla schema_migrations en schema.rb. Sin embargo, el error no ocurre en MySQL, aunque es interesante.
agregado el autor James A. Rosen, fuente
También puede tener algo que ver con el uso de table_name_prefix. Al hacer un rake db: schema: load, obtengo tablas con doble prefijo.
agregado el autor James A. Rosen, fuente

3 Respuestas

En SQLite, la exclusividad del nombre de índice se aplica en el nivel de la base de datos. En MySQL, la singularidad solo se aplica a nivel de tabla. Es por eso que sus migraciones funcionan en este último y no en el anterior: tiene dos índices con el mismo nombre en diferentes tablas.

Cambie el nombre del índice, o busque y cambie el nombre del otro índice unique_schema_migrations , y sus migraciones deberían funcionar.

14
agregado
Tuve el mismo problema en Laravel, cuando las pruebas comienzan a migrar, dice que el índice ya existe. Cambié todos los índices para tener un nombre único (anteponiendo el nombre de la tabla) y funcionó. Esta es la respuesta correcta, creo.
agregado el autor morksinaanab, fuente

En su archivo database.yml ¿sus entornos están configurados para conectarse a diferentes bases de datos para Desarrollo y Prueba?

ES DECIR:

development:
  adapter: sqlite3
  database: db/dev.sqlite3
  timeout: 5000

test:
  adapter: sqlite3
  database: db/test.sqlite3
  timeout: 5000
2
agregado

Try to search if your schema.rb file does not contain other declarations that create an index with the same name: unique_schema_migrations

0
agregado