2011-09-17 6 views
6

यह त्रुटि मैं जब मैं पहली बार वसीयत को स्थापित कर रहा हूँ और rake db:migrate चलाने के है:वसीयत रेक db: विस्थापित मेरी उपयोगकर्ता की तालिका में डुप्लिकेट स्तंभ के कारण विफल रहता - रेल 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 

यह देखते हुए कि यह सिर्फ परीक्षण डाटा है , मैं बस अपने डीबी में उस कॉलम को हटा सकता हूं और इसे फिर से चला सकता हूं, लेकिन यह बहुत रेलवे प्रतीत नहीं होता है - अगर केवल इसलिए कि यह मेरा स्टेजिंग सर्वर (मेरे ऐप के साथ एकमात्र अन्य सर्वर) बना देगा, मेरे 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

रेक डीबी का प्रयास करें: रोलबैक और फिर पुन: प्रयास करें। जब आपने पहली बार यह आईडी कॉलम जोड़ा था। और आप

आईडी जोड़ना: पूर्णांक शून्य नहीं, प्राथमिक कुंजी यह रेल में स्वचालित है। इसे ऐसा दिखना चाहिए।

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 

अधिक जानकारी आप यहाँ http://guides.rubyonrails.org/migrations.html

+1

कोई भी नहीं हुआ कि मेरे पास 'डीबी: माइग्रेट' चलाने से पहले मेरे स्कीमा के साथ मेरा 'उपयोगकर्ता' मॉडल था। मेरे पास मौजूदा जानकारी के साथ तालिका में संग्रहीत कुछ उपयोगकर्ता भी थे। हालांकि, अब मैं एक मौजूदा उपयोगकर्ता मॉडल में डेविस स्थापित करने की कोशिश कर रहा हूं, मुझे यह त्रुटि मिलती है। तो हाँ, मुझे पता है कि एक 'ईमेल' कॉलम मौजूद है। मैं बस इसे या तो अनदेखा करना चाहता हूं, या संशोधित करने की आवश्यकता के तरीके को संशोधित करना चाहता हूं। – marcamillion

+1

आप इसे छोड़ सकते हैं लेकिन अपने प्रवासन पर हमारी लाइन पर टिप्पणी कर सकते हैं। उसके बाद, आप रेक डीबी चलाते हैं: फिर से माइग्रेट करें। – Benjamin

+1

हाँ यहां एक ही समस्या है और मैंने जो कुछ किया है, वह उस पंक्ति पर टिप्पणी कर रहा है जहां ईमेल तालिका को # t.string जैसे ईमेल माइग्रेशन में बनाया गया है: ईमेल,: 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 कॉल/डब्ल्यू बनाओ वसीयत के द्वारा उत्पन्न फ़ाइल,

के लिए लाइन

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

बदल

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

तो एक नया ईमेल कॉलम बनाने की कोशिश करने के बजाय, प्रवासन मौजूदा व्यक्ति को डेविस के विनिर्देशों में बदल देता है।

3

इस त्रुटि का समाधान करना सरल

  1. है अगर आप पहले से ही चलाने "rake db:migrate" मेरा सुझाव है rake db:rollback चलाने "
  2. जाओ करने के लिए" timestamp_add_devise_to_whatever.rb और बाहर टिप्पणी
  3. # t.string :email, null: false, default: ""
  4. अगला भी इस
  5. टिप्पणी
  6. # add_index :users, :email, unique: true
  7. रन rake db:migrate और आपके जाने के लिए अच्छा है। :)
+0

आप भयानक हैं- यह बहुत अच्छा काम करता है- स्टैक ओवरफ्लो हमेशा चयनित व्यक्ति के रूप में सबसे खराब जवाब है- यह समाज की एक बग है! –

संबंधित मुद्दे