4

実行中に以下のエラーが発生し続けるのはなぜですかrake db:migrate...

SQLite3::CantOpenException: データベース ファイルを開けません: CREATE UNIQUE INDEX

devise github readmeのレターhttps://github.com/plataformatec/devise#getting-startedに従い 、新しいプロジェクトを作成しましたが、それでもエラーが発生します。

新しいレール アプリを作成しました: (成功)
レールの新しいtestT_app

gem 'devise'Gemfile に追加: (成功)
gem「デバイス」

バンドルをインストールしました: (成功)
バンドル インストール

Railsジェネレーターを実行しました:(成功)
rails generate device:install

User という名前のデバイスモデルを生成しました: (成功)
rails generate device ユーザー

SQLite3:CantOpenException (データベース ファイルを開くことができない)でSO の質問を参照したため、rake db:create返された which を使用してみました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 に答える
0

私は同様の問題を抱えていたので、この方法に従うことをお勧めします。移行は 2 つの手順で行います。たとえば、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はdbレベルで一意性を強制し、この方法でそれを行うと問題が解決するため、通常どおり移行すると、これは機能し、エラーはスローされません。

それでもエラーが発生する場合にこれを解決する別の方法は、エントリごとに個別の移行を作成することです。例えば:

$ 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 に答える