मेरा स्कीमा खो दिया है। आरबी! क्या यह पुनर्जीवित हो सकता है?


133

कुछ परिनियोजन समस्याओं के कारण मैंने git में स्कीमा ट्रैकिंग को बंद कर दिया है। किसी तरह मैंने इसे भर दिया है और कहीं मेरी स्कीमा.आरबी फ़ाइल गायब हो गई है।

क्या डेटाबेस से या माइग्रेशन से स्कीमा पुन: प्राप्त करने का एक तरीका है? मैं मौजूदा डेटा को नहीं खोना पसंद करूंगा।

जवाबों:


230

यदि आप rake -Tइसे चलाते हैं, तो यह आपके रेल परियोजना के लिए सभी संभावित रेक कार्यों को सूचीबद्ध करेगा। उनमें से एक डीबी है: स्कीमा: डंप जो डेटाबेस से रेल एप्लिकेशन के लिए स्कीमा.बीआर को फिर से बनाएगा।

bundle exec rake db:schema:dump

बहुत धन्यवाद, बहुत से उत्तर, लेकिन ऐसा लगता है कि आप पहले (सिर्फ) आपके लिए इतने टिक गए थे। बस उत्सुक, क्या यह डेटाबेस से या माइग्रेशन से स्कीमा उत्पन्न करता है?
ब्रैड

7
डेटाबेस से ही, इसलिए सावधान रहें अगर प्रवास के बाहर हुए बदलाव हैं।
मुगिमोन

1
schema.rb में अभी भी खाली स्कीमा rake db:schema:dump2.0 रेल पर
होगा

मेरे schema.rb फ़ाइल वास्तव में ऊपर बताए गए आदेशों चलाने के बाद एक ही रहता है
stevec

59

सावधान,

rake db:schema:dump

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

यदि आप माइग्रेशन से स्कीमा को फिर से बनाना चाहते हैं, तो निम्न कार्य करें:

rake db:drop  # ERASES THE DATABASE !!!! 
rake db:create
rake db:migrate

1
इससे डेटा की हानि होगी, जो ओपी ने कहा कि वे बचना चाहते थे। इसके अतिरिक्त, जैसा कि कॉलिन बताते हैं, डेटाबेस को शुद्ध रूप से माइग्रेशन से पुनर्जीवित करना संभवतः एक बहुत बुरा विचार है क्योंकि विषम निर्भरता के मुद्दों (आमतौर पर बोलने) में चलने की बढ़ती संभावना है। यदि लंबित माइग्रेशन हैं, तो संभव है कि विकास मशीन पर उन अंतिम माइग्रेशन को चलाने के लिए, और उसके बाद rake db:schema:dumpकमांड चलाएँ।
पॉल रिक्टर

4
मेरे जवाब में हर कैनवास स्पष्ट रूप से समझाया गया है। मैं केवल स्कीमा चलाकर काट लिया है: डंप और एक साफ स्कीमा नहीं मिल रहा है। ओपी सीवीएस में स्कीमा को ट्रैक करने की बात कर रहा है। मैं अपने माइग्रेशन में अपनी परिभाषाओं के साथ अपने स्कीमा को संरेखित करना चाहूंगा न कि किसी प्रोडक्शन डीबी या पुराने डेवलपमेंट डीबी से अप्रचलित संस्करण
गेमोव

11
rake db:schema:dump

मुझे लगता है कि यह अभी भी रेल 3 में मान्य है - यह डेटाबेस से स्कीमा.बीआर को पुन: बनाता है।


8

5 तरीके:

rails db:schema:dump

या यदि आप मणि का सामना करते हैं :: LoadError तो:

bundle exec rails db:schema:dump

ध्यान दें:

रेल में 5 यह अनुशंसा की जाती है कि railsइसके बजाय का उपयोग करके कार्य उत्पन्न / निष्पादित किया जाता है rake, यह सिर्फ याद रखने के लिए है, रेल उत्पन्न कार्य विस्तार .rakeमें हैं lib/tasks/myTask.rake। जिसका अर्थ है कि इन कार्यों को पूर्व निर्धारित करके भी निष्पादित किया जा सकता है rake


5

यदि आप schema.rbस्थानीय रूप से पुन: निर्माण करते हैं , तो आपको ठीक होना चाहिए। यह केवल आपके डेटाबेस तालिकाओं की संरचना का प्रतिनिधित्व करता है। डेटा ही इस फ़ाइल में समाहित नहीं है।

अपनी schema.rbफ़ाइल पुन : बनाने के लिए, दौड़ें:

bundle exec rake db:schema:dump

तो बस नई schema.rbफ़ाइल को कमिट करें और आपको अच्छे आकार में होना चाहिए!


4

सीधे schema.rb फ़ाइल से ही:

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

तो उस सुझाव का मत करो rake db:migrate, जो इस लेखन के समय में - सबसे कम मूल्यांकित उत्तर में सुझाया गया था।


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

1

मुझे भी इसी तरह की समस्या थी जहां मेरा पुराना स्कीमा माइग्रेशन डिलीट करने पर भी ताज़ा नहीं था।

इसलिए, मैंने जो कुछ किया, वह डेटाबेस में मौजूद सभी तालिकाओं को छोड़ रहा था और उन्हें फिर से स्थानांतरित कर रहा था। फिर "डीबी: स्कीमा: लोड" कमांड चलाने से मुझे एक नया स्कीमा मिला। आरआरबी।

drop table my_table_name // deleted them individually
rake db:migrate
rake db:schema:dump // re-created a new schema
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.