2013-05-08 5 views
12

वर्तमान में मैं इस एप्लिकेशन के लिए एक बड़ी रेल एप्लिकेशन और कई शाखाओं के साथ काम कर रहा हूं। ऐसा होता है कि एक फीचर को माइग्रेशन की आवश्यकता होगी, जो तब तक कोई समस्या नहीं होनी चाहिए जब तक कि आप इसे मास्टर के साथ मर्ज न करें: schema.rb को आपके dev डेटाबेस की जानकारी के साथ अपडेट किया गया है!schema.rb अन्य शाखाओं में माइग्रेशन के कारण गड़बड़ हुई

स्पष्ट करने के लिए:

1. Branch A has migration create_table_x 
2. Branch B has migration create_table_y 
3. Branch A adds another create_table_z and runs db:migrate 
4. You want to merge Branch A with Master and you see table_x, table_y and table_z in the schema.rb of Branch A. 

यह पुनर्स्थापित करने के लिए + एक शाखा में हर माइग्रेशन से पहले डेटाबेस बीज या शाखा प्रति एक डेटाबेस बनाने के लिए एक विकल्प नहीं है। 2 जीबी एसक्यूएल डेटा के विशाल आकार के कारण, यह काम करने योग्य नहीं होगा।

मेरा प्रश्न:

यह वास्तव में भंडार में schema.rb रखने के लिए के बाद से यह हर प्रवास का पुनर्निर्माण हो जाता है की आवश्यकता है?

यदि हां, तो डेटाबेस डंप के बजाय माइग्रेशन से स्कीमा बनाना संभव है?

+0

मुझे लगता है कि आप अपने भंडार में अपने schema.rb रखना चाहिए। ऐसा हो सकता है कि कोई माइग्रेशन फ़ाइलों को साफ़ करता है और अतीत से कुछ अप्रयुक्त माइग्रेशन हटा देता है..और यदि आपके पास एक समान स्कीमा नहीं है। आरबी मैं एक गड़बड़ी में समाप्त हो सकता है। स्कीमा फ़ाइल को हर माइग्रेशन को अपडेट किया जाता है, पूरी तरह से पुनर्निर्माण नहीं करता है। लेकिन वैसे भी एक दिलचस्प सवाल है। – Mattherick

+0

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

+0

संभावित डुप्लिकेट स्विच को कॉपी (http [क्या Git में schema.rb प्रबंधन करने के लिए पसंदीदा तरीका है?]: // stackoverflow .com/प्रश्न/737,854/क्या-है-हेतु अनुशंसित तरह से प्रबंधित करने में-स्कीमा-rb में Git) – Tachyons

उत्तर

9

आप अपने रेपो के भीतर स्कीमा रखना चाहिए। माइग्रेशन चलाने से आपके स्कीमा.आरबी फ़ाइल में विलय विवाद ठीक हो जाएंगे। मेरे प्रश्नों पर मेरा सरल

  1. क्या यह आवश्यक है? वास्तव में नहीं, लेकिन अच्छी प्रैक्टिस।

"यह दृढ़ता से अपने संस्करण कंट्रोल सिस्टम में इस फ़ाइल की जाँच की सिफारिश की है।" -schema.rb

  1. यह संभव है? हाँ, लेकिन आप अपने आप से पूछना करने के लिए यदि आप वास्तव में, ऐसा करके किसी भी समय की बचत या तो स्वयं या कहीं और से आपके माइग्रेशन बंद स्कीमा के निर्माण और इसे आगे बढ़ाने कर सकते हैं।

आप जीई

rake db:schema:load 

और

rake db:schema:dump 

http://tbaggery.com/2010/10/24/reduce-your-rails-schema-conflicts.html

2

रेपो में schema.rb को रखना महत्वपूर्ण है, क्योंकि आप स्कीमा.आरबी से एक नया डेटाबेस उत्पन्न करने में सक्षम होने के लिए एक नया डेवलपर (या आपका परीक्षण वातावरण) चाहते हैं। जब आपके पास बहुत सारे माइग्रेशन होते हैं, तो वे सभी चलने के लिए जारी नहीं रह सकते हैं, विशेष रूप से यदि वे मॉडल कक्षाओं पर भरोसा करते हैं जो अस्तित्व में नहीं हैं, या बदल गए हैं, या माइग्रेशन पहली बार चलने के बाद अलग-अलग सत्यापन हैं। जब आप अपने परीक्षण चलाते हैं, तो आप स्कीमा.आरबी से अपने डेटाबेस को डंप और फिर से बनाना चाहते हैं, हर बार जब आप पूर्ण परीक्षण सूट चलाते हैं तो सभी माइग्रेशन को फिर से चलाकर नहीं।

आप दो अलग अलग सुविधा शाखाओं एक साथ काम कर रहे हैं, और दोनों में डेटाबेस संरचना बदल रहे हैं, तो मुझे लगता है कि schema.rb अपनी समस्याओं का कम से कम है। यदि आप शाखा बी में किसी कॉलम का नाम बदलते हैं या हटाते हैं, तो जब भी पुराने कॉलम का संदर्भ मिलता है तो शाखा ए तोड़ने जा रहा है। यदि वे सभी नई टेबल बना रहे हैं, तो यह खराब नहीं है, लेकिन फिर आप स्कीमा.आरबी चाहते हैं जब आप मास्टर से ए में विलय करते हैं, ताकि ए माइग्रेशन को दूसरी बार चलाने की कोशिश न करे और असफल हो क्योंकि नई तालिका पहले से मौजूद है।

है कि आपके सवाल का जवाब नहीं है, हो सकता है आप अपने कार्यप्रवाह थोड़ा और समझा सकता है?

+0

यह सही है, लेकिन आप शाखा बी के टेबल नहीं करना चाहते हैं (आपके द्वारा निष्पादित माइग्रेशन) से पहले आप शाखा बी विलय उदाहरण के लिए मास्टर में दिखाने: यदि एक मेज है कि दोनों शाखा एक और शाखा बी में इस्तेमाल किया जाता है, ** शाखा बी का नाम बदल कर LAST_NAME को **, ** शाखा एक के नाम के पहले अक्षर में परिवर्तन पहला नाम**। आप शाखा एक विलय, आप शाखा बी विलय न, क्योंकि यह कुछ जटिलताओं => ** उत्पन्न स्कीमा शामिल first_name और last_name **, जब तुम नहीं बल्कि होता है ** first_name और नाम **। कुछ तर्क मास्टर में नहीं माइग्रेशन की जांच करना और स्कीमा.आरबी – Vikko

+0

में रोलबैक के लिए अच्छा लग सकता है, जो पहले अच्छा लगता है, लेकिन कुछ माइग्रेशन इतने उलटा नहीं हो सकता है। आप शायद इसे मैन्युअल रूप से पूरा कर सकते हैं: रेक डीबी: VERSION = 123 माइग्रेट करें जहां 123 आपकी schema.rb में माइग्रेशन नंबर है। उस संस्करण को पाने के लिए आवश्यकतानुसार आगे या पीछे माइग्रेट करना चाहिए। आखिरकार, आपकी सबसे अच्छी शर्त कम से कम संभव समय पर मास्टर में विलय की गई प्रत्येक शाखा से माइग्रेशन प्राप्त करने जा रही है, भले ही आपको इसे चेरी-पिकिंग द्वारा करना है। – sockmonk

+1

मुझे लगता है कि के बारे में पता है, लेकिन इस मुद्दे के बारे में 20 शाखाएं है जो सभी के लिए कुछ घंटे और कुछ ही महीनों के बीच एक जीवन भर .. Thats जहां जटिलताओं में आते है साथ काम कर रहा है: आप भूल जाते हैं शाखा माइग्रेशन था और आप फँस रहे हैं ! इसके अलावा, एक बड़ी मेज (100,000+ रिकॉर्ड) पर माइग्रेशन उम्र लेते हैं। यदि आप अपनी वर्तमान शाखा में तालिका का उपयोग नहीं करते हैं तो आप उन्हें विकास के लिए वहां छोड़ देंगे और सिर्फ स्कीमा अपडेट करेंगे। – Vikko

1

ताजा अस्थाई एक त्वरित समाधान का

उदाहरण के लिए के रूप में डीबी का उपयोग करने का tthe अतिरिक्त लाभ, निम्न कार्य करें जबभी तुम बहुत विशेष शाखा पर db/schema.rb की जरूरत है:

  1. Git चेकआउट - db/schema.rb
  2. विभिन्न विकास डेटाबेस के लिए स्विच, यानी अद्यतन config/database.yml
  3. रेक db: ड्रॉप & & रेक db : सेटअप
  4. रेक db: विस्थापित
  5. अपने सुंदर db/schema.rb प्रतिबद्ध
  6. config में परिवर्तन वापस/database.yaml
संबंधित मुद्दे