4

为什么我在运行时不断收到下面的错误rake db:migrate...

SQLite3::CantOpenException:无法打开数据库文件:CREATE UNIQUE INDEX

我已经按照设计 github 自述文件上的信https://github.com/plataformatec/devise#getting-started 创建了一个全新的项目,但仍然出现错误。

创建了一个新的铁路应用程序:(成功
导轨新的 testT_app

添加gem 'devise'到我的 Gemfile 中:(成功
宝石“设计”

安装包:(成功
捆绑安装

运行 rails 生成器:(成功
rails 生成设计:安装

生成了一个名为 User 的设计模型:(成功
rails 生成设计用户

我在SQLite3:CantOpenException (uanble to open database file)提到了 SO 问题, 这导致我尝试使用rake db:createwhich returned db/development.sqlite3 already exists。美好的。

然后我rake db:migrate按照入门运行.. :(失败
错误SQLite3::CantOpenException: unable to open database file: CREATE UNIQUE INDEX "index_users_on_email" ON "users" ("email")/cygdrive/c/users/daniel/workspace/ruby/rails/tesT_app/db/migrate/20130606041329_devise_create_users.rb:40:in更改'`

怎么了?我正在关注这封信,但无法弄清楚!

我真的很感激。

编辑: ...create_users.rb 上的第 40 行是
add_index :users, :email, :unique => true

请注意,我没有碰任何东西。

4

3 回答 3

3

在 SQLite 中,索引名称的唯一性是在数据库级别强制执行的。在 MySQL 中,您不会重现相同的问题。您可以更改索引名称或注释掉这一行(并在生产中部署时返回),或更改数据库(我的意思是改用 mysql)。

于 2013-06-06T05:59:08.883 回答
1

抱歉,我以为您有一个单独的用户模型。能否请您发布您的迁移文件?也请尝试运行

rake db:drop

(删除您当前的数据库)然后

rake db:create and rake db:migrate

这将确保您正在迁移到全新的数据库。

于 2013-06-06T06:08:02.043 回答
0

我有类似的问题,我建议按照这种方式。分两步进行迁移:例如,假设您有一个名为 users 的迁移。像你一样正常迁移它,但这里还没有强制唯一性:

class CreateUsers < ActiveRecord::Migration
  def change
    create table :users do |t|
      t.integer :name
      t.integer :email
      t.timestamps
    end
  end
end

通过使用迁移:

$ bundle exec rake db:migrate

迁移后,创建另一个迁移:

$ rails generate migration add_index_users_name_email

在此迁移文件中,添加唯一性:

class AddIndexUsersNameEmail < ActiveRecord::Migration
  def change
    add_index :users, :name, unique: true
    add_index :users, :email, unique: true
  end
end

像往常一样迁移,这应该可以工作并且不会抛出错误,因为正如 Ivan 提到的,SQLite 在数据库级别强制执行唯一性,并且以这种方式执行此操作将解决问题。

如果仍然抛出错误,另一种解决方法是为每个条目创建单独的迁移。例如:

$ rails generate migration add_index_users_name
$ rails generate migration add_index_users_email

class AddIndexUsersName < ActiveRecord::Migration
  def change
    add_index :users, :name, unique: true
  end
end

class AddIndexUsersEmail < ActiveRecord::Migration
  def change
    add_index :users, :email, unique: true
  end
end

让我知道它是否解决了您的问题

于 2013-06-11T01:06:57.817 回答