4


0

Railsで「index unique_schema_migrationsは既に存在します」という問題を解決するにはどうすればいいですか?

rake db:migrate`を実行してから rake test:units`を実行すると以下のようになります。

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

`db / schema.rb`の関連部分は以下の通りです。

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

私は手動でこのインデックスを変更するのではなく、真新しいデータベースでRailsのデフォルトのSQLite3アダプタを使用しています。 (つまり、 rake db:migrate`の前に rm db / * sqlite3`を実行しても意味がありません。)

`test:units`タスクはおそらくスキーマを再ロードしようとしているのでしょうか。 もしそうなら、なぜ? スキーマがすでに最新のものであることを認識してはいけませんか。

3 Answer


14


SQLiteでは、インデックス名の一意性はデータベースレベルで強制されます。 MySQLでは、一意性はテーブルレベルでのみ強制されます。 前者ではなく後者でマイグレーションが機能するのはそのためです。異なるテーブルに同じ名前の2つのインデックスがあります。

インデックスの名前を変更するか、他の `unique_schema_migrations`インデックスを見つけて名前を変更すると、マイグレーションはうまくいくはずです。


2


あなたのdatabase.ymlファイルであなたの環境は開発とテストのために異なるデータベースに接続するようにセットアップされていますか?

IE:

開発:アダプタ:sqlite3データベース:db / dev.sqlite3タイムアウト:5000

テスト:アダプタ:sqlite3データベース:db / test.sqlite3タイムアウト:5000


0


schema.rbファイルに同じ名前のインデックスを作成する他の宣言が含まれていないか検索してみてください: unique_schema_migrations