2011-09-17 1 views
6

이것은 Devise를 처음 설치하고 rake db:migrate을 실행할 때 나타나는 오류입니다.Devise rake db : 사용자 테이블의 중복 열로 인해 마이그레이션이 실패합니다. - Rails 3.1

== AddDeviseToUsers: migrating =============================================== 
-- change_table(:users) 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

SQLite3::SQLException: duplicate column name: email: ALTER TABLE "users" ADD "email" varchar(255) DEFAULT '' NOT NULL 

이것은 테스트 데이터 일 뿐이므로 데이터베이스의 해당 열을 삭제하고 다시 실행할 수는 있습니다. 매우 Railsy 인 것처럼 보입니다 - 내 스테이징 서버 (내 앱이있는 유일한 다른 서버)가 localhost과 동기화되지 않는 이유만으로도 그렇습니다.

또한 다른 컬럼과 충돌이 있으면 어떻게 될까요?

따라서 마이그레이션을 실행하기 전에이 User 테이블의 스키마가 있다고 가정하면 어떻게 처리해야합니까? 이름 바꾸기를 수행하는 일종의 마이그레이션이 있습니까?

# == Schema Information 
# 
# Table name: users 
# 
# id   :integer   not null, primary key 
# email  :string(255) 
# f_name  :string(255) 
# l_name  :string(255) 
# username :string(255) 
# role_id :integer 
# picture :string(255) 
# about_me :string(255) 
# website :string(255) 
# created_at :datetime 
# updated_at :datetime 
# 

답변

4

rake db : rollback을 시도한 다음 다시 시도하십시오. 첫 번째 작업을 수행했을 때 id 열이 추가되었습니다. 왜 당신입니까

id : intege not null, 기본 키 레일에 자동입니다. 이렇게 보일 것입니다.

class CreateProducts < ActiveRecord::Migration 
    def up 
    create_table :products do |t| 
     t.string :email 
     t.text :f_name 

     t.timestamps 
    end 
    end 

    def down 
    drop_table :products 
    end 
end 

당신은 내가 기존 DB에 고안 추가 같은 일을 명중 자세한 내용은 여기 http://guides.rubyonrails.org/migrations.html

+1

'db : migrate'를 실행하기 전에 그 스키마가있는 'User' 모델을 가지고 있었는데 아무 일도 없었습니다. 테이블에 기존 정보가 저장된 사용자도있었습니다. 그러나 기존 사용자 모델에 Devise를 설치하려고하므로이 오류가 발생합니다. 그래서 네,': email' 칼럼이 있다는 것을 압니다. 난 그냥 그것을 무시하거나 수정해야 할 방식으로 수정하고 싶습니다. – marcamillion

+1

당신은 건너 뛸 수 있지만 마이 그 레이션에서 우리의 라인을 주석. 그 다음에는 rake db : migrate를 다시 실행합니다. – Benjamin

+1

그래도 여기와 같은 문제는 전자 메일 테이블이 devise 마이그레이션에서 만들어지는 줄을 주석 처리 한 것입니다. # t.string : email, : null => false, : default => "" – mattwallace

2

를 얻을 수 있습니다. 이것은 나를 위해 그것을 고정 :

t.rename :email, :email_old # move my old email field out of the way 
... 
#add_index :users, :email, :unique => true ## comment out unique index 

는 DB 마이그레이션 :

가 자동 생성 유증 마이그레이션을 수정합니다.

update users set email=id; 

는 고유 제한 조건을 추가하는 또 다른 마이그레이션을 만들고 실행 :

class UniquifyIndex < ActiveRecord::Migration 
    def change 
     add_index :users, :email, :unique => true 
    end 
16

를 마이그레이션에서

은 (새) 이메일 필드 데이터가 승 SQL 호출/대화 형으로 독특한 엔트리 확인 궁리에 의해 생성 된 파일

0123의 행

t.string :email,    :null => false, :default => "" 

변경

t.change :email, :string,  :null => false, :default => "" 

따라서 새 이메일 열을 만들지 않고 기존 이메일 주소를 Devise의 사양으로 변경합니다.이 오류를 해결

3

이미 실행하면 "rake db:migrate"나는

  • # t.string :email, null: false, default: ""
  • 다음이
  • 을 언급 timestamp_add_devise_to_whatever.rb 및 주석 "을
  • 이동"rake db:rollback를 실행하는 것이 좋습니다

    1. 간단합니다
    2. # add_index :users, :email, unique: true
    3. 실행 rake db:migrate 그리고 잘 가야합니다. :)
  • +0

    당신은 멋지군요. 이 위대한 작품 - stackoverflow 항상 하나의 최악의 답변을 가지고 - 이것은 사회의 버그입니다! –

    관련 문제