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 中,唯一性仅在表级别强制执行。这就是为什么您的迁移在后者而不是前者中起作用的原因:您在不同的表上有两个同名的索引。

重命名索引,或者找到并重命名另一个unique_schema_migrations索引,您的迁移应该可以工作。

于 2009-12-30T22:30:29.720 回答
2

在您的 database.yml 文件中,您的环境是否设置为连接到不同的数据库以进行开发和测试?

IE:

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 回答