2011-10-24 18 views
25

मैंने डिवीज और निफ्टी जनरेटर के साथ एक डेटाबेस बनाया है। मैं गंधा जनरेटर (rails g nifty:scaffold Asset user_id:integer) के साथ एक नया डेटाबेस बनाने के लिए कोशिश कर रहा हूँ, लेकिन जब मैं डेटाबेस (rake db:migrate) विस्थापित करने के लिए प्रयास करते हैं, मैं निम्नलिखित त्रुटि मिलती है: मैं एक ट्यूटोरियल अनुसरण कर रहा हूँरेक निरस्त ... तालिका 'उपयोगकर्ता' पहले से मौजूद है

charlotte-dator:showwwdown holgersindbaek$ rake db:migrate 
== DeviseCreateUsers: migrating ============================================== 
-- create_table(:users) 
rake aborted! 
An error has occurred, all later migrations canceled: 

Mysql2::Error: Table 'users' already exists: CREATE TABLE `users` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `email` varchar(255) DEFAULT '' NOT NULL, `encrypted_password` varchar(128) DEFAULT '' NOT NULL, `reset_password_token` varchar(255), `reset_password_sent_at` datetime, `remember_created_at` datetime, `sign_in_count` int(11) DEFAULT 0, `current_sign_in_at` datetime, `last_sign_in_at` datetime, `current_sign_in_ip` varchar(255), `last_sign_in_ip` varchar(255), `name` varchar(255), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB 

Tasks: TOP => db:migrate 
(See full trace by running task with --trace) 

और है काफी कठिन समय यह समझता है कि ऐसा क्यों होता है। क्या कोई बता सकता है कि क्या हो रहा है?

उत्तर

11

माइग्रेशन एक तालिका बनाने की कोशिश कर रहा है जो आपके डेटाबेस में पहले से मौजूद है।

अपने डेटाबेस से उपयोगकर्ता तालिका को हटाने का प्रयास करें। माइग्रेशन प्रक्रिया के साथ कुछ गड़बड़ हुई। आपको अपने schema.rb संस्करण की तुलना अपने डीबी/माइग्रेट/* आरबी फाइलों के साथ भी करनी चाहिए।

स्पष्टीकरण:

ऐसा लगता है कि कई अतः उन मेरा जवाब से सहमत नहीं हैं, क्योंकि या तो वे यह गलत या सिफारिश नहीं की पर विचार करें।

एक तालिका को हटाने हमेशा विनाशकारी होता है, और मुझे लगता है कि हर कोई इसे समझता है।

मुझे add_column का उल्लेख करना चाहिए था, क्योंकि तालिका किसी अन्य माइग्रेशन फ़ाइल में बनाई जा रही थी।

+39

बस तालिका हटाएं? यह एक भयानक समाधान है। –

+1

मैं आपका समाधान जानना चाहता हूं। –

+12

यह स्पष्ट है, लेकिन मैं किसी के लिए स्पष्टीकरण देना चाहता हूं जो ऐसा करता है ... ** उस तालिका में आपका डेटा खो जाएगा **। –

58

अपने create_users प्रवास में (APP_ROOT/db/विस्थापित/..), drop_table :users सही create_table :users से पहले जोड़ सकते हैं और rake db:migrate चलाते हैं। यह पुन: प्रयास करने से पहले उपयोगकर्ता तालिका को हटा देगा। आप इस माइग्रेशन को चलाने के बाद कोड की उस पंक्ति को हटा सकते हैं, इसलिए यह आपको बाद में त्रुटियां नहीं देता है। यदि आपके पास डेटाबेस में यूआई पहुंच नहीं है (उदाहरण के लिए, उसके हीकू पर) तो बस एक छोटा फिक्स।

+0

दोनों समाधान अर्ध-काम किया ... ऐसा लगता है कि मैंने वास्तव में कुल मिलाकर कुछ गलत किया है, इसलिए मैंने कुछ कदम उठाए और फिर से किया। हालांकि महान समाधान के लिए बहुत बहुत धन्यवाद। –

+13

यह स्पष्ट है, लेकिन मैं किसी के लिए स्पष्टीकरण देना चाहता हूं जो ऐसा करता है ... ** उस तालिका में आपका डेटा खो जाएगा **। –

+0

डोप। धन्यवाद दोस्त। –

10

यदि आपको पता है कि डेटाबेस ठीक से बनाया गया था, तो आप केवल माइग्रेशन कोड के निर्माण भाग पर टिप्पणी कर सकते हैं। उदाहरण के लिए:

Class ActsAsVotableMigration < ActiveRecord::Migration 
    def self.up 
# create_table :votes do |t| 
# 
#  t.references :votable, :polymorphic => true 
#  t.references :voter, :polymorphic => true 
# 
#  t.boolean :vote_flag 
# 
#  t.timestamps 
# end 
# 
# add_index :votes, [:votable_id, :votable_type] 
# add_index :votes, [:voter_id, :voter_type] 
    end 

    def self.down 
    drop_table :votes 
    end 
end 

तो तालिका में बनाया गया था, लेकिन बाद में आदेशों किसी कारण से पूरा नहीं किया गया, तो आप सिर्फ बाद में विकल्प उदाहरण के लिए छोड़ सकते हैं:

Class ActsAsVotableMigration < ActiveRecord::Migration 
    def self.up 
# create_table :votes do |t| 
# 
#  t.references :votable, :polymorphic => true 
#  t.references :voter, :polymorphic => true 
# 
#  t.boolean :vote_flag 
# 
#  t.timestamps 
# end 

    add_index :votes, [:votable_id, :votable_type] 
    add_index :votes, [:voter_id, :voter_type] 
    end 

    def self.down 
    drop_table :votes 
    end 
end 

आप नहीं है, तो आपके डेटाबेस में किसी भी महत्वपूर्ण डेटा को संरक्षित रखने के लिए हालांकि आप इसे केवल तालिका और सभी डेटा छोड़ सकते हैं और इसे ताजा बना सकते हैं। उदाहरण के लिए (नोटिस "drop_table: वोट", self.up में):

class ActsAsVotableMigration < ActiveRecord::Migration 
    def self.up 
    drop_table :votes 
    create_table :votes do |t| 

     t.references :votable, :polymorphic => true 
     t.references :voter, :polymorphic => true 

     t.boolean :vote_flag 

     t.timestamps 
    end 

    add_index :votes, [:votable_id, :votable_type] 
    add_index :votes, [:voter_id, :voter_type] 
    end 

    def self.down 
    drop_table :votes 
    end 
end 
1

मुझे लगता है कि यह कोई मुद्दा mysql2 मणि ​​के साथ क्या करना रेल में अद्वितीय या mysql के लिए और अधिक आम, संभव होने है अपने आप।

मुझे यह पता है क्योंकि मैंने अभी स्क्लाइट से mysql में स्विच किया है और बस इस समस्या को व्यवस्थित रूप से शुरू करना शुरू कर दिया है।

मेरे मामले में, मैंने बस उस कोड को टिप्पणी की जो पहले से चल चुका था और माइग्रेशन फिर से चला गया (जिसे मैं अधिक विस्तार नहीं जोड़ रहा हूं क्योंकि ऐसा लगता है कि मेरे ऊपर वाले लड़के ने ऐसा किया था)।

1

मौजूदा उपयोगकर्ता तालिका में डेविस प्रमाणीकरण जोड़ने का प्रयास करते समय मुझे एक ही समस्या थी।

मेरा समाधान: मैंने पाया कि मेरे पास उपयोगकर्ता तालिका बनाने की कोशिश कर रहे दो माइग्रेट फ़ाइलें थीं। तो तालिका को हटाने की बजाय (शायद फॉर्म बनाने की सबसे अच्छी आदत नहीं है), मैंने पहली (मूल) माइग्रेट फ़ाइल पर टिप्पणी की जिसने उपयोगकर्ता तालिका बनाई और फिर डेविस माइग्रेट फ़ाइल को छोड़ दिया। माइग्रेशन फिर से चलाया और यह ठीक काम किया।

जैसा कि यह पता चला है, डेविस फ़ाइल समस्या का कारण नहीं बना रही थी; मैं देख सकता हूं कि यह तालिका को "बदल रहा" है, न कि इसे "बनाना", जिसका अर्थ है कि यहां तक ​​कि डिवीजन इंस्टॉलेशन के बिना, एक डीबी: माइग्रेट संभवतः एक ही समस्या का कारण बनता है (हालांकि मैंने इसका परीक्षण नहीं किया है)।

21

आप (आप सभी डेटा उसमें शामिल खो जाएगा) एसक्यूएल लाइट कंसोल से उस तालिका ड्रॉप करने

  1. पहुँच एसक्यूएल लाइट कंसोल, टर्मिनल
    mysql <DB NAME HERE>

  2. में प्रकार की जरूरत है ड्रॉप तालिका (न पिछले भूलना; (अर्धविराम))
    drop table table_name;

  3. रन db: विस्थापित फिर
    bin/rake db:migrate

आशा है कि यह मदद करता है, यह मेरे लिए काम किया

+0

प्रश्न MySQL के बारे में है, स्क्लाइट नहीं। –

+0

सचमुच mysql के लिए संपादित किया गया –

11

आप चाहते हैं खेलने के लिए सुरक्षित और किसी भी डेटा खोने के लिए नहीं करना चाहते हैं तो आप जांच कर सकते हैं, तो तालिका आपके डेटाबेस में मौजूद है।

class DeviseCreateUsers < ActiveRecord::Migration 
    def up 
    if table_exists?(:users) 
     # update or modify columns of users table here accordingly. 
    else 
     # create table and dump the schema here 
    end 
    end 

    def down 
    # same approach goes here but in the reverse logic 
    end 
end 
0

आप चाहते हैं अपने डेटा, रखने तालिका नाम बदलने, लेकिन प्रवास में यह करना, समय बचाने के लिए तो इसे हटाने के एक बार प्रवास भाग गया गया है।

माइग्रेशन फ़ाइल के अनुभाग के शीर्ष भाग पर रखें।

rename_table :users, :users2 
4

टेबल हटाएं नहीं। डेटा > माइग्रेशन!

डेटाबेस का संस्करण पहले से ही त्रुटि-कारण माइग्रेशन जोड़ने की कोशिश कर रहा है, जो परिवर्तनों को दर्शाता है। दूसरे शब्दों में, अगर माइग्रेशन छोड़ा जा सकता है, तो सबकुछ ठीक होगा। Db_schema_migrations तालिका जांचें और गलत माइग्रेशन (e.x, 20151004034808) के संस्करण को डालने का प्रयास करें। मेरे मामले में इसने बाद में माइग्रेशन को निष्पादित करने के लिए प्रेरित किया और सब कुछ ठीक लगता है।

अभी भी यह सुनिश्चित नहीं है कि इस समस्या का कारण क्या है।

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