Wie löse ich "index unique_schema_migrations" bereits in Rails?

Das Ausführen von rake db: migrate gefolgt von rake test: units ergibt Folgendes:

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

Der relevante Teil von db/schema.rb ist wie folgt:

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

Ich ändere diesen Index nirgendwo manuell und verwende den Standard-SQLite3-Adapter von Rails mit einer brandneuen Datenbank. (Das heißt, das Ausführen von rm db/* sqlite3 vor rake db: migrate hilft nicht.)

Trifft die Aufgabe test: units möglicherweise das Schema erneut? Wenn ja warum? Sollte es nicht erkennen, dass das Schema bereits aktuell ist?

4
Es gibt definitiv keine anderen Indexdeklarationen für die schema_migrations-Tabelle in der schema.rb. Der Fehler tritt bei MySQL nicht auf, interessanterweise jedoch.
hinzugefügt der Autor James A. Rosen, Quelle
Es kann auch etwas mit meiner Verwendung von table_name_prefix zu tun haben. Wenn ich einen Rake db: schema: load tue, bekomme ich doppelt präfixierte Tabellen.
hinzugefügt der Autor James A. Rosen, Quelle

3 Antworten

In SQLite wird die Eindeutigkeit des Indexnamens auf Datenbankebene erzwungen. In MySQL wird die Eindeutigkeit nur auf Tabellenebene erzwungen. Aus diesem Grund arbeiten Ihre Migrationen in letzterem und nicht ersteren: Sie haben zwei Indizes mit demselben Namen in verschiedenen Tabellen.

Benennen Sie den Index um, oder suchen Sie den anderen unique_schema_migrations -Index, und benennen Sie ihn um. Ihre Migrationen sollten dann funktionieren.

14
hinzugefügt
Ich hatte das gleiche Problem in Laravel, wenn der Test beginnt zu migrieren, sagt Index bereits existiert. Ich habe alle Indizes so geändert, dass sie einen eindeutigen Namen haben (vor dem Tabellennamen) und es hat funktioniert. Das ist die richtige Antwort, glaube ich.
hinzugefügt der Autor morksinaanab, Quelle

In Ihrer Datenbank.yml-Datei sind Ihre Umgebungen so eingerichtet, dass sie sich mit verschiedenen Datenbanken für Entwicklung und Test verbinden können.

IE:

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

test:
  adapter: sqlite3
  database: db/test.sqlite3
  timeout: 5000
2
hinzugefügt

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
hinzugefügt