2008-10-14 56 views
4

運行rake db:migrate其次rake test:units產生如下:如何在Rails中解決「index unique_schema_migrations already exists」的問題?

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任務可能試圖重新加載架構?如果是這樣,爲什麼?它不應該認識到模式已經是最新的嗎?

+0

schema.rb中的schema_migrations表肯定沒有其他索引聲明。雖然這個bug在MySQL上不會發生,但有趣的是, – 2008-10-14 17:12:11

+0

它也可能與我使用table_name_prefix有關。當執行rake db:schema:load時,我得到雙重前綴的表。 – 2008-10-14 17:12:53

回答

0

嘗試搜索,如果你的schema.rb文件不包含創建具有相同名稱的索引其他聲明:unique_schema_migrations

2

在您的database.yml文件是您的環境設置爲連接到促進發展不同的數據庫和測試?

IE:

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

test: 
    adapter: sqlite3 
    database: db/test.sqlite3 
    timeout: 5000 
14

SQLite中,索引名稱唯一性在數據庫級別執行。在MySQL中,唯一性僅在表級別強制執行。這就是爲什麼你的遷移工作在後者而不是前者:你在不同的表上有兩個同名的索引。

重命名索引,或查找並重命名其他unique_schema_migrations索引,並且您的遷移應該可以工作。