मैं अपने प्रोजेक्ट को लॉन्च करने के लिए तैयार हूं। लॉन्च के बाद मेरे पास बड़ी योजनाएं हैं और डेटाबेस संरचना बदलने जा रही है - मौजूदा तालिकाओं में नए कॉलम के साथ-साथ नए टेबल और मौजूदा और नए मॉडल के लिए नए संघ।
मैंने अभी तक Sequelize में माइग्रेशन को नहीं छुआ है, क्योंकि मेरे पास केवल डेटा का परीक्षण है जो कि हर बार डेटाबेस में परिवर्तन होने पर मुझे बुरा नहीं लगता।
उस समय तक, sync force: true
जब मैं अपना ऐप शुरू कर रहा हूं, अगर मैं मॉडल की परिभाषा बदल चुका हूं, तो मैं चल रहा हूं । यह सभी तालिकाओं को हटाता है और उन्हें खरोंच से बनाता है। मैं इस force
विकल्प को छोड़ सकता था कि इसमें केवल नई तालिकाएँ हों। लेकिन अगर मौजूदा वाले बदल गए हैं तो यह उपयोगी नहीं है।
इसलिए एक बार जब मैं माइग्रेशन में शामिल होता हूं तो चीजें कैसे काम करती हैं? जाहिर है मैं नहीं चाहता कि मौजूदा तालिकाओं (उनमें डेटा के साथ) को मिटा दिया जाए, इसलिए sync force: true
यह सवाल से बाहर है। अन्य एप्लिकेशन पर मैंने ऐप की तैनाती प्रक्रिया के भाग के रूप में (लारवेल और अन्य फ्रेमवर्क) विकसित करने में मदद की है हम किसी भी लंबित माइग्रेशन को चलाने के लिए माइग्रेट कमांड चलाते हैं। लेकिन इन ऐप्स में पहले ही माइग्रेशन में एक कंकाल डेटाबेस होता है, राज्य में डेटाबेस के साथ जहां यह विकास में कुछ समय पहले था - पहला अल्फा रिलीज या जो भी हो। इसलिए पार्टी में देर से आने वाले ऐप का एक उदाहरण क्रम में सभी माइग्रेशन चलाकर, एक बार में गति प्राप्त कर सकता है।
मैं Sequelize में ऐसा "पहला माइग्रेशन" कैसे उत्पन्न करूं? यदि मेरे पास एक नहीं है, तो एप्लिकेशन का एक नया उदाहरण किसी तरह से लाइन के नीचे माइग्रेशन को चलाने के लिए कोई कंकाल डेटाबेस नहीं होगा, या यह शुरू में सिंक चलाएगा और सभी के साथ नए राज्य में डेटाबेस बना देगा नए टेबल आदि, लेकिन तब जब वे उन माइग्रेशन को चलाने की कोशिश करते हैं, जिनसे उन्हें कोई मतलब नहीं होगा, क्योंकि वे मूल डेटाबेस और प्रत्येक क्रमिक पुनरावृत्ति को ध्यान में रखते हुए लिखे गए थे।
मेरी विचार प्रक्रिया: प्रत्येक चरण में, प्रारंभिक डेटाबेस और अनुक्रम में प्रत्येक माइग्रेशन तब उत्पन्न होने वाले डेटाबेस (प्लस या माइनस डेटा) के बराबर होना चाहिए sync force: true
दौड़ हैं। ऐसा इसलिए है क्योंकि कोड में मॉडल विवरण डेटाबेस संरचना का वर्णन करते हैं। इसलिए हो सकता है कि अगर कोई माइग्रेशन टेबल नहीं है तो हम सिर्फ सिंक को चलाते हैं और सभी माइग्रेशन को चिन्हित करते हैं, भले ही वे रन नहीं हुए हों। क्या मुझे ऐसा करने की आवश्यकता है (कैसे?), या सीक्वेलाइज़ को स्वयं ऐसा करने के लिए माना जाता है, या क्या मैं गलत पेड़ को काट रहा हूं? और अगर मैं सही क्षेत्र में हूं, तो निश्चित रूप से पुराने मॉडल (कमिट हैश द्वारा दिए गए) को ऑटो में सबसे अच्छा माइग्रेशन उत्पन्न करने का एक अच्छा तरीका होना चाहिए? या यहां तक कि प्रत्येक माइग्रेशन को एक प्रतिबद्धता से जोड़ा जा सकता है? गैर-पोर्टेबल गिट-केंद्रित ब्रह्मांड में) और नए मॉडल। यह संरचना को अलग कर सकता है और डेटाबेस को पुराने से नए और फिर से बदलने के लिए आवश्यक कमांड उत्पन्न कर सकता है, और फिर डेवलपर अंदर जा सकता है और किसी भी आवश्यक मोड़ (विशेष डेटा आदि को हटाने / परिवर्तित) कर सकता है।
जब मैं सिक्वल बाइनरी को --init
कमांड के साथ चलाता हूं तो यह मुझे एक खाली माइग्रेशन डायरेक्टरी देता है। जब मैं sequelize --migrate
इसे चलाता हूं तो यह मुझे एक SequelizeMeta तालिका बनाता है जिसमें कुछ भी नहीं है, कोई अन्य तालिका नहीं है। जाहिर है, क्योंकि बाइनरी मेरे ऐप को बूटस्ट्रैप और मॉडल लोड करने का तरीका नहीं जानता है।
मेरा कुछ छूट रहा है।
TLDR: मैं अपने ऐप और इसके माइग्रेशन को कैसे सेट कर सकता हूं ताकि लाइव ऐप के विभिन्न उदाहरणों को अद्यतित किया जा सके, साथ ही साथ कोई नया डेटाबेस शुरू न होने वाला डेटाबेस भी हो?
sync
अभी के लिए उपयोग कर रहे हैं, तो यह विचार है कि माइग्रेशन पूरे डेटाबेस को "उत्पन्न" करता है, इसलिए एक कंकाल पर निर्भर होना अपने आप में एक समस्या है। उदाहरण के लिए, रेल वर्कफ़्लो पर रूबी, सब कुछ के लिए माइग्रेशन का उपयोग करता है, और जब आप इसकी आदत डाल लेते हैं, तो यह बहुत बढ़िया होता है। संपादित करें: और हाँ, मैंने देखा कि यह प्रश्न बहुत पुराना है, लेकिन यह देखते हुए कि कभी कोई संतोषजनक उत्तर नहीं मिला है और लोग मार्गदर्शन की तलाश में यहाँ आ सकते हैं, मुझे लगा कि मुझे योगदान देना चाहिए।