रेक डीबी: स्कीमा: लोड बनाम माइग्रेशन


171

यहां बहुत ही सरल प्रश्न है - यदि माइग्रेशन धीमा हो सकता है और बोझिल हो सकता है क्योंकि एक ऐप अधिक जटिल हो जाता है और यदि हमारे पास अधिक क्लीनर है rake db:schema:load कॉल करने के लिए है, तो माइग्रेशन बिल्कुल क्यों मौजूद हैं?

यदि उपरोक्त का उत्तर यह है कि माइग्रेशन का उपयोग संस्करण नियंत्रण (डेटाबेस में परिवर्तन का एक चरणबद्ध रिकॉर्ड) के लिए किया जाता है, तो जैसे ऐप एक अधिक जटिल हो जाता है और rake db:schema:loadइसका उपयोग अधिक किया जाता है, क्या वे अपने प्राथमिक फ़ंक्शन को बनाए रखना जारी रखते हैं?


सावधान:

इस सवाल के जवाब से: rake db:schema:load उत्पादन सर्वर पर डेटा को हटा देगा ताकि इसका उपयोग करते समय सावधान रहें।


5
+1 मैंने पलायन का उद्देश्य कभी नहीं समझा; क्यों नहीं संस्करण स्कीमा को नियंत्रित करता है?
वैकल्पिक

5
@alternative - माइग्रेशन आपको अन्य सामान करने की अनुमति देता है, जैसे यदि आपको एक गैर-नल स्तंभ जोड़ने की आवश्यकता है तो आप कुछ डिफ़ॉल्ट मान का उपयोग करने के बजाय स्मार्ट रूप से उस कॉलम को डेटा से भर सकते हैं।
जोश एम।

जवाबों:


208

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

यह कहा जा रहा है, मेरा मानना ​​है कि यह कभी-कभी "पतन" पलायन के लिए एक सभ्य अभ्यास है। यह पुराने माइग्रेशन को हटाने, उन्हें एक एकल माइग्रेशन (आपकी schema.rbफ़ाइल के समान ) के साथ schema_migrationsबदलने और इस परिवर्तन को प्रतिबिंबित करने के लिए तालिका को अपडेट करने की आवश्यकता है । ऐसा करते समय बहुत सावधान रहें! यदि आप सावधान नहीं हैं तो आप आसानी से अपने उत्पादन डेटा को हटा सकते हैं।

एक साइड नोट के रूप में, मेरा दृढ़ता से मानना ​​है कि आपको माइग्रेशन फ़ाइलों में डेटा निर्माण कभी नहीं करना चाहिए। seed.rbफ़ाइल या कस्टम रेक या तैनाती कार्य इस के लिए इस्तेमाल किया जा सकता है। इसे माइग्रेशन फ़ाइलों में डालने से आपके डेटा विनिर्देश के साथ आपके डेटाबेस स्कीमा विनिर्देश को मिलाया जाता है और माइग्रेशन फ़ाइलों को चलाते समय संघर्ष हो सकता है।


80
उस रेक डीबी: स्कीमा: लोड को सूचित करने के लिए धन्यवाद सभी उत्पादन डेटा को हटा देता है!
मैग्ने

2
स्कीमा की नकल करने वाले एक नए के साथ "ध्वस्त" माइग्रेशन को बदलने के बजाय, मैंने एक मणि लिखा, जो उन्हें केवल साफ करता है, और उपयोगकर्ताओं को संकेत देता है db:schema:loadकि यदि वे db:migrateएक ताजा इंस्टॉल के खिलाफ चलने की कोशिश करते हैं । @ Clear_migrations
Yarin

शायद एक स्पष्ट उत्तर लेकिन उत्पादन से पहले धक्का देने से पहले, क्या आप सभी माइग्रेशन को हटाने और पहले माइग्रेशन के रूप में db.schema का उपयोग करने की सलाह देंगे?
dtc

30

बस इस पोस्ट पर ठोकर खाई, जो बहुत पहले था और मुझे वह उत्तर नहीं मिला जिसकी मुझे उम्मीद थी।

rake db:schema:loadपहली बार महान है जब आप उत्पादन में एक प्रणाली डालते हैं। उसके बाद आपको सामान्य रूप से माइग्रेशन चलाना चाहिए।

जब भी आप चाहें, यह आपको अपने माइग्रेशन को साफ करने में भी मदद करता है, क्योंकि स्कीमा के पास आपके माइग्रेशन को साफ करने पर भी अन्य मशीनों को उत्पादन में लगाने की सारी जानकारी होती है।


तो आप अपने प्रवास को "शुद्ध" कर सकते हैं क्योंकि आपको उनका उपयोग कभी नहीं करना है? एक विचित्र कथन की तरह लगता है।
अबे पेट्रिलो

यह मेरे लिए स्पष्ट नहीं db:schema:loadहै कि विकास के पूरे चक्र में एक बार कुछ सेकंड के लिए शेविंग करने के अलावा अन्य का क्या फायदा है। क्या आपने कभी ऐसे ऐप के साथ काम किया है जिसे बनने में 30 सेकंड से अधिक समय लगा हो? मैं वर्तमान में एक ऐसे ऐप पर काम कर रहा हूं, जिसमें यह माइग्रेशन फ़ाइलों में बग्स हैं और यह बग फिक्स किए बिना या कभी भी माइग्रेट नहीं होगा या db:schema:loadजो मुझे स्कीमा बनाता है: लोड तब होता है जब somethings ऐप के विकास के बारे में गलत हो गया हो।
निंजाक्सोर

एक और तर्क मैं माइग्रेशन रखने के लिए बनाऊंगा कि रेल टीम उपयोगकर्ताओं को निर्देश देती है instead of editing schema.rb, please use the migrations feature। इसलिए यदि आप db:schema:loadएक ऐसी ऑटो-जेनरेट की गई फ़ाइल पर चल रहे हैं, जिसमें आपके पास फिर से ऑटो-जेनरेट करने के लिए माइग्रेशन नहीं है, तो आप स्कीमा और डिस्यूज़ माइग्रेशन को मैन्युअल रूप से "एडिट" करने का रास्ता अपना रहे हैं। काश मेरे पास इस पर रेल गाइड से एक प्रशस्ति पत्र होता, लेकिन वे स्कीमा: लोड की चर्चा नहीं करते, जो स्कीमा: लोड सुविधा के दृष्टिकोण के बारे में निर्णय लेने में मेरी हताशा को बढ़ा देता है। = /
निंजाकोर

मैं इस पृष्ठ पर ठीक-ठीक आया क्योंकि मैं इससे सहमत हूं। मेरा अनुभव यह है कि साइट के उत्पादन में होने के बाद, इसे बदलने के लिए माइग्रेशन का उपयोग करना अधिक सुरक्षित है। इसके बावजूद, db / schema.rb की शुरुआत की टिप्पणियाँ ठीक इसके विपरीत बताती हैं! (मुझे हर प्रोजेक्ट के शुरू होने में समस्या है क्योंकि मैं .bbignore में db / schema.rb डालना भूल जाता हूं ...)
user1251840

@AbePetrillo वाह, मैं इस टिप्पणी से पूरी तरह से चूक गया। बेशक, मेरा मतलब यह नहीं है कि आप चाहें तो पुराने माइग्रेशन को साफ कर सकते हैं जो सभी उत्पादन मशीनों पर चलाए गए हैं। वर्षों से मैंने उन्हें हमेशा अपने आस-पास रखा है, लेकिन जब भी आप चाहें तो मेरा "आपको अपने माइग्रेशन को साफ करने में मदद करता है" कथन का अर्थ यह नहीं था कि "मुझे कभी भी माइग्रेशन का उपयोग नहीं करना होगा"। इसलिए, जब आप एक नई मशीन की तैनाती करते हैं, तो इसके rake db:schema:loadविपरीत चलाएं rake db:migrate। फिर वहाँ से, आप कर सकते हैं rake db:migrate
ereslibre

9

माइग्रेशन आपको db में भी डेटा जोड़ने की सुविधा देता है। लेकिन db: स्कीमा: लोड केवल स्कीमा को लोड करता है।


6

क्योंकि माइग्रेशन वापस लुढ़का जा सकता है, और अतिरिक्त कार्यक्षमता प्रदान कर सकता है। उदाहरण के लिए, यदि आपको स्कीमा परिवर्तन के हिस्से के रूप में कुछ डेटा को संशोधित करने की आवश्यकता है, तो आपको प्रवास के रूप में ऐसा करने की आवश्यकता होगी।


4

अन्य ORM के उपयोगकर्ता के रूप में, यह मुझे हमेशा अजीब लगता था कि रेल में 'सिंक और अपडेट' सुविधा नहीं थी। यानी, स्कीमा फ़ाइल (जो संपूर्ण, अप-टू-डेट स्कीमा का प्रतिनिधित्व करती है) का उपयोग करके, मौजूदा डीबी संरचना के माध्यम से जाएं और आवश्यकतानुसार तालिकाओं, स्तंभों, अनुक्रमितों को जोड़ें / निकालें।

मेरे लिए यह बहुत अधिक मजबूत होगा, भले ही थोड़ा धीमा हो।


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

खुद के गाइड स्पष्ट रूप से बताते हैं कि schemaमास्टर हैं, माइग्रेशन नहीं।
ड्रेनमी

0

मैंने पहले ही एक टिप्पणी के रूप में पोस्ट किया है, लेकिन यह महसूस करना बेहतर है कि db / schema.rb फ़ाइल की टिप्पणियों को यहाँ रखा जाए:

# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.

वास्तव में, मेरा अनुभव यह है कि माइग्रेशन फ़ाइलों को गिट में डालना बेहतर है न कि स्कीमा.आरबी फ़ाइल ...


0

rake db:migrateडेटाबेस में तालिकाओं को सेटअप करें। जब आप माइग्रेशन कमांड चलाते हैं, तो यह डीबी / माइग्रेट / किसी भी रूबी फ़ाइलों के लिए दिखेगा और उन्हें सबसे पुराने के साथ शुरू करना होगा। प्रत्येक माइग्रेशन फ़ाइल नाम की शुरुआत में टाइमस्टैम्प होता है।

इसके विपरीत rake db:migrateजो माइग्रेशन चलाता है, जो अभी तक नहीं चला है, डेटाबेस rake db:schema:loadमें पहले से उत्पन्न स्कीमा को लोड करता है db/schema.rb

आप यहां रेक डेटाबेस कमांड के बारे में अधिक जानकारी प्राप्त कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.