Cum pot rezolva "indexul unique_schema_migrations există deja" în Rails?

Rularea rake db: migrate urmată de test rake: units are următoarele rezultate:

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")

Partea relevantă a db/schema.rb este următoarea:

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

Nu schimb manual acest indice nicăieri și folosesc adaptorul SQLite3 implicit al lui Rails cu o bază de date nouă. (Aceasta înseamnă că rulează rm db/* sqlite3 înainte ca rake db: migrate să nu ajute.)

Este probabil ca încercarea test: units să încerce să reîncărcați schema? Dacă da, de ce? Nu ar trebui să recunoască faptul că schema este deja actualizată?

4
Nu există nicio altă declarație de index pentru tabela schema_migrations din schema.rb. Problema nu se întâmplă în MySQL, însă destul de interesant.
adăugat autor James A. Rosen, sursa
S-ar putea să aibă și ceva de-a face cu utilizarea metodei table_name_prefix. Când faci o schemă db: schema: încărcare, primesc mese dublu-prefixate.
adăugat autor James A. Rosen, sursa

3 răspunsuri

În SQLite, unicitatea numelui indexului este pusă în aplicare la nivelul bazei de date. În MySQL, unicitatea este aplicată doar la nivelul mesei. De aceea, migrația dvs. funcționează în cea de-a doua și nu în prima: aveți doi indici cu același nume pe diferite mese.

Redenumiți indexul sau găsiți și redenumiți indicele unique_schema_migrations , iar migrațiile ar trebui să funcționeze.

14
adăugat
Am avut aceeași problemă în Laravel, când testarea începe să migreze, spune că există deja un index. Am schimbat toți indicii pentru a avea un nume unic (prependând numele tabelului) și a funcționat. Acesta este răspunsul corect pe care îl cred.
adăugat autor morksinaanab, sursa

În fișierul dvs. database.yml sunt mediile dvs. configurate pentru a vă conecta la diferite baze de date pentru dezvoltare și testare?

IE:

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

test:
  adapter: sqlite3
  database: db/test.sqlite3
  timeout: 5000
2
adăugat

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
adăugat