2012-11-30 14 views
6

जब मैं अपने डीबी माइग्रेट करने का प्रयास करता हूं तो मुझे एक त्रुटि मिल रही है। मैं पूरी तरह से याद है कि कैसे मैं यहाँ है, लेकिन मुझे विश्वास है कि मैं:रेल डीबी माइग्रेशन त्रुटि: संबंध पहले से मौजूद है

  1. नई शाखा, scaffolded 'अनुरोध', डाटाबेस बनाया: माइग्रेट, गुरु में वापस स्विच, और मर्ज किए गए शाखा
  2. अन्य शाखा बनाई गई, कुछ सामान किया, डीबी: माइग्रेटेड, और सब कुछ ठीक काम कर रहा था।
  3. heroku postgres डेटाबेस से खींचा गया ताकि मैं वास्तविक डेटा के साथ काम करने पर परीक्षण कर सकूं। तो db माइग्रेट कोशिश की, लेकिन मुझे इस त्रुटि दिया:

    rake db:migrate 
    == CreateRequests: migrating ================================================= 
    -- create_table(:requests) 
    NOTICE: CREATE TABLE will create implicit sequence "requests_id_seq1" for serial column "requests.id" 
    rake aborted! 
    An error has occurred, this and all later migrations canceled: 
    
    PG::Error: ERROR: relation "requests" already exists 
    : CREATE TABLE "requests" ("id" serial primary key, "title" character varying(255), "content" text, "category" character varying(255), "status" character varying(255), "requested_track_id" integer, "created_at" timestamp, "updated_at" timestamp) 
    

कोई भी विचार?

+1

एक अंतर्निहित अनुक्रम बनाने के बारे में संदेश एक त्रुटि नहीं है, केवल एक नोटिस (एक सूचनात्मक संदेश। यह किसी भी तालिका के लिए सामान्य है जो स्वत: वृद्धिशील कॉलम का उपयोग करता है जो सक्रिय आईडी 'id' कॉलम के लिए डिफ़ॉल्ट रूप से करेगा।त्रुटि यह है कि 'अनुरोध' तालिका पहले से मौजूद है। – qqx

+0

तो इस मामले में मुझे क्या करना होगा कि मुझे वह संदेश मिले? मैंने तालिका को छोड़ने के लिए माइग्रेशन बनाकर हल किया, और फिर उसी तालिका को बनाने के लिए माइग्रेशन को दोबारा शुरू किया। क्या कोई बेहतर तरीका है? – kibaekr

+1

आपका डेटाबेस स्कीमा सभी शाखाओं का शुद्ध परिणाम होने वाला है, वही वातावरण मानता है। जब तक आप शाखाओं को मर्ज नहीं करते हैं, तब तक आपका कोड जरूरी नहीं है कि वास्तव में अंतर्निहित डीबी पर माइग्रेशन की श्रृंखला दिखाई दे। और, जब आप माइग्रेशन चलाते हैं, तो पूर्व माइग्रेशन के लिए चेक केवल मौजूदा माइग्रेशन के खिलाफ किए जाएंगे, जो संभावित संघर्षों को इंगित करेंगे। मैं एक शाखा में सभी प्रवासन रखने का सुझाव देना चाहता हूं। –

उत्तर

4

मुझे यकीन है कि वास्तव में क्या रणनीति आप इस्तेमाल किया खींच नहीं कर रहा हूँ, लेकिन अगर हम अपने पुल रणनीति के बारे में दो उचित मान्यताओं:

  1. यह डेटाबेस ड्रॉप नहीं है लेकिन सिर्फ टेबल अधिलेखित कर देता है, क्योंकि यह कम की आवश्यकता है अनुमतियाँ।
  2. यह एक 'संग्रह मोड' में काम कर रहा है, जिसका अर्थ है कि यह गंतव्य पर टेबल नहीं छोड़ता है क्योंकि वे स्रोत पर मौजूद नहीं हैं। Rsync सोचो; उस उपयोगिता के साथ आपका अपेक्षित व्यवहार क्या हो सकता है, यह जानने के लिए आपको --delete निर्दिष्ट करना होगा।

अपने चरणों सही हैं, तो फिर क्या हुआ आप schema_migrations तालिका को अधिलेखित कर दिया है, इसलिए रेल सोचता है कि आप अब तक नहीं जोड़ा तालिका, लेकिन न तो अपने Heroku खींच क्योंकि ऊपर # 2 की तालिका ड्रॉप किया था।

कोई अन्य माइग्रेशन न बनाएं !!! यह आपके अलावा अन्य सभी एल्स के कंप्यूटर पर असफल हो जाएगा, लेकिन केवल एक बार आपके लिए चलाएगा।

इसके बजाय, rails dbconsole चलाएं और DROP TABLE 'requests' जैसे कुछ निष्पादित करें (मैं पोस्टग्रेस सिंटैक्स भूल जाता हूं, शायद यह ठीक नहीं हो सकता है)। फिर आप अपने माइग्रेशन चला सकते हैं।

2

इसमें डेटा के साथ एक टेबल छोड़ने से बचने का एक और तरीका है।

मैं उन मामलों में क्या करता हूं यह जांचना है कि कौन सा प्रवास विफल रहा है।

मान लें कि आपके पास फ़ाइल db/migrate/20130908214222_create_requests.rb है, और किसी कारण से, ActiveRecord अतीत में विफल रहा जब इस माइग्रेशन को "ट्रैकिंग सिस्टम" में संग्रहीत किया गया।

सुनिश्चित करें कि यह मामला है, बस मिल जाए, schema_migrations तालिका में होने के लिए, एक पंक्ति इस उदाहरण की तरह एक नंबर युक्त 20130908214222

तो उस पंक्ति मौजूद नहीं है, तो आप सिर्फ एक नया डालने के लिए है :

INSERT INTO schema_migrations(
    version 
) VALUES (
    20130908214222 
); 

अगली बार जब आप rake db:migrate चलाने के लिए, ActiveRecord इस कदम को छोड़ जाएगा, और जटिलताओं के बिना समाप्त करने के लिए पलायन जारी रहेगा।

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