为什么我在新的rails实例上运行rake db:migrate时会出现错误?

时间:2013-06-06 04:34:35

标签: ruby ruby-on-rails-3 devise

为什么在运行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 `change'

我在设计github自述文件中跟随https://github.com/plataformatec/devise#getting-started的字母,创建了一个全新的项目,但仍然得到了错误。

创建了新的铁路应用 :( 成功
rails new tesT_app

gem 'devise'添加到我的Gemfile :( 成功
gem 'devise'

已安装捆绑 :( 成功
bundle install

跑出轨道生成器 :( 成功
rails generate devise:install

生成名为User 的设计模型:(成功
rails generate devise User

我在SQLite3:CantOpenException (uanble to open database file)提到了SO问题,导致我尝试使用返回rake db:create的{​​{1}}。细

然后我开始使用db/development.sqlite3 already exists .. :( 失败
错误rake db:migrate更改'`

发生了什么事?我正在跟着这封信开始,并且无法弄清楚这一点!

我真的很感激。

编辑:行:40 on ... create_users.rb是
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

并注意到我没有触及任何东西。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

抱歉,我认为你有一个独立的用户模型。 你能发布你的迁移文件吗? 也请尝试运行

rake db:drop

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

rake db:create and rake db:migrate

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

答案 2 :(得分: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

如果它能解决您的问题,请告诉我