web-dev-qa-db-ja.com

Railsチュートリアル:SQLite3 :: ConstraintException:UNIQUE制約に失敗しました:users.email

Railsチュートリアルをフォローしています。6章にいますが、SQLite3で奇妙なエラーが発生します(記録のために、sqliteバージョン1.3.10を使用しています)チュートリアルでは1.3.9を使用しています)

Rake db:migrateを実行してもエラーは発生しませんが、テスト環境で移行を実行すると、次のようになります。

$ bundle exec rake test:models

rake aborted!
ActiveRecord::PendingMigrationError:

Migrations are pending. To resolve this issue, run:

    bin/rake db:migrate Rails_ENV=test

sample_app/test/test_helper.rb:3:in `<top (required)>'
sample_app/test/models/user_test.rb:1:in `require'
sample_app/test/models/user_test.rb:1:in `<top (required)>'
Tasks: TOP => test:models
(See full trace by running task with --trace)


$ bundle exec rake db:migrate Rails_ENV=test

== 20150628011937 AddIndexToUsersEmail: migrating ===========================
==
    -- add_index(:users, :email, {:unique=>true})
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:


SQLite3::ConstraintException: UNIQUE constraint failed: users.email: CREATE UNIQUE INDEX "index_users_on_email" ON "users" ("email")sample_app/db/migrate/20150628011937_add_index_to_users_email.rb:3:in `change'
C:in `migrate'
ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: UNIQUE constrain
t failed: users.email: CREATE UNIQUE INDEX "index_users_on_email" ON "users"
("email")
sample_app/db/migrate/20150628011937_add_index_to_users_email.rb:3:in `change'
C:in `migrate'
SQLite3::ConstraintException: UNIQUE constraint failed: users.email
sample_app/db/migrate/20150628011937_add_index_to_users_email.rb:3:in `change'
C:in `migrate'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

これが私のuser.rbモデルです:

class User < ActiveRecord::Base
  before_save { self.email = email.downcase }
  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
end

これが私の最新の移行です

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

関連する他のファイルを投稿できます。助けてくれてありがとう!

12
Ben Muschol

問題は、移行前にデータベースに同じ電子メールを持つユーザーがいたことでした。

db:resetすべてを解決しました

23
Ben Muschol

私は少し異なる理由でそれを経験しました、そしてここに解決策があります。

私にとってエラーは

_Minitest::UnexpectedError: ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: UNIQUE constraint failed: users.email: INSERT INTO "users" ("created_at", "updated_at", "id") VALUES ('2018-05-09 18:23:59.827561', '2018-05-09 18:23:59.827561', 298486374)
_

INTO "users" ("created_at", "updated_at", "id")に注意してください。 test/Fixtures/users.ymlが入力されなかったため、一意のキー制約がある列に重複した値がありました。

test/Fixtures/users.yml

_# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html

# This model initially had no columns defined. If you add columns to the
# model remove the '{}' from the fixture names and add the columns immediately
# below each fixture, per the syntax in the comments below
#
one: {}
# column: value
#
two: {}
# column: value
_
3
Mailo Světel

できない場合はreset:db手動で削除してみてください。dbフォルダーに移動し、「development.sqlite3" そしてその "test.sqlite3 "ファイルを実行してからRails db:migrateおよびbin/Rails db:migrate Rails_ENV=TEST

とにかく、私のために働いた...

2
Moshe Edri

rake db:test:prepareを使用するだけで、devデータベースがコピーされてテストされるため、移行を実行する必要はありません。

0
Sarge