为什么在运行rake db:migrate
...
我在设计github自述文件中跟随https://github.com/plataformatec/devise#getting-started的字母,创建了一个全新的项目,但仍然得到了错误。
创建了新的铁路应用 :( 成功)
将gem 'devise'
添加到我的Gemfile :( 成功)
已安装捆绑 :( 成功)
跑出轨道生成器 :( 成功)
生成名为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
并注意到我没有触及任何东西。
答案 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
如果它能解决您的问题,请告诉我