4

実行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アダプターと新しいデータベースを使用しています。(つまり、rm db/*sqlite3前に実行rake db:migrateしても役に立ちません。)

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

4

3 に答える 3

14

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

インデックスの名前を変更するか、他のunique_schema_migrationsインデックスを見つけて名前を変更すると、移行が機能するはずです。

于 2009-12-30T22:30:29.720 に答える
2

database.yml ファイルで、開発用とテスト用の異なるデータベースに接続するように環境が設定されていますか?

いいえ:

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

test:
  adapter: sqlite3
  database: db/test.sqlite3
  timeout: 5000
于 2008-10-15T22:59:04.813 に答える
0

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

于 2008-10-14T16:34:01.720 に答える