2015-10-27 10 views
12

मेरा ऐप वर्तमान में डेटाबेस बनाने के लिए Sequelize sync() विधि का उपयोग करता है, और मैं इसे माइग्रेशन सिस्टम का उपयोग करने के लिए बदलना चाहता हूं।Sequelize माइग्रेशन में संघ

मेरे मॉडल में से एक के पास अन्य मॉडलों के साथ belongsTo() एसोसिएशन हैं, और मुझे वास्तव में नहीं पता कि इन संगठनों के लिए प्रारंभिक माइग्रेशन कोड कैसे बनाया जाए।

क्या मुझे मैन्युअल रूप से SQL क्वेरी के साथ विदेशी कुंजी बनाना है, या क्या कुछ विधियां उपलब्ध हैं?

+0

आप प्रारंभिक डेटाबेस संरचना बनाने के लिए माइग्रेशन का उपयोग करना चाहते हैं या आप माइग्रेशन का उपयोग करके अपनी वर्तमान डेटाबेस संरचना को अपडेट करना चाहते हैं? – ezpn

+0

मैं प्रारंभिक डेटाबेस संरचना पहले – loics2

उत्तर

11

केस 1: डेटाबेस प्रारंभ उद्देश्य डेटाबेस संरचना यह बेहतर है के प्रारंभ के दौरान संबंधों को जोड़ने के लिए बस के बजाय मैन्युअल रूप से माइग्रेशन का उपयोग कर उन्हें जोड़ने का sync विधि का उपयोग करने के लिए है

हैं। यदि आपके मॉडल सही ढंग से डिज़ाइन किए गए हैं और संबंधों को परिभाषित किया गया है, तो वे sync विधि के निष्पादन के दौरान स्वचालित रूप से बनाए जाएंगे।

sequelize express example पर एक नज़र डालें। मॉडल निर्देशिका में आप तीन फ़ाइलें:

  • index.js - जो सभी मॉडलों
  • शामिल
  • task.js - कार्य मॉडल
  • user.js - task.js सामग्री पर उपयोगकर्ता मॉडल

देखो, लाइन 7 से शुरू निम्नलिखित कोड उपयोगकर्ता और कार्य मॉडल के बीच संबंध बनाता है:

classMethods: { 
    associate: function(models) { 
    Task.belongsTo(models.User, { 
     onDelete: "CASCADE", 
     foreignKey: { 
     allowNull: false 
     } 
    }); 
    } 
} 

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

मैं आपको पूरे एक्सप्रेस-उदाहरण readme.md पढ़ने और रिपोजिटरी फ़ाइलों को ब्राउज़ करने के लिए प्रोत्साहित करता हूं ताकि यह देखने के लिए कि चीजें एक्सप्रेस और अनुक्रमित कैसे होती हैं।

केस 2: डेटाबेस संरचना प्रवास

मामले में आप पहले से ही कुछ डेटा जो आप रखना चाहते हैं, तो आप, प्रवास स्क्रिप्ट का उपयोग करने की जरूरत है क्योंकि सिंक अपने डेटाबेस पुनर्गठन करने के लिए एक ही रास्ता इसे नष्ट करने के लिए है अपने सभी डेटा के साथ पूरी तरह से।

आप मूल migrations in the sequelize docs के बारे में पढ़ सकते हैं। दुर्भाग्यवश दस्तावेज़ों में संबंध बनाने में शामिल नहीं है। आइए मान लें कि आप निम्न संबंध बनाना चाहते हैं: उपयोगकर्ता समूह से संबंधित है। संबंध के उपयोगकर्ता पक्ष पर कॉलम बनाने के लिए, आप addColumn विधि का उपयोग कर सकते हैं।

queryInterface.addColumn(
    'user', 
    'group_id', 
    { 
    type: Sequelize.INTEGER, 
    allowNull: true 
    } 
) 

दुर्भाग्य से एक अच्छा समारोह (अभी तक) आप के लिए विदेशी कुंजी बाधा पैदा करने के लिए नहीं है, लेकिन आप इसे मैन्युअल का उपयोग कर sequelize क्वेरी विधि कर सकते हैं। PostgreSQL उदाहरण:

queryInterface.sequelize.query("ALTER TABLE user 
    ADD CONSTRAINT user_group_id_fkey FOREIGN KEY (group_id) 
    REFERENCES group (id) MATCH SIMPLE 
    ON UPDATE CASCADE ON DELETE CASCADE;"); 

संपादित करें: जोड़ा गया डेटाबेस संरचना प्रवास मामले

+0

हम्म ठीक धन्यवाद बनाना चाहता हूं। मुझे लगता है कि मैं माइग्रेशन और सिंक और उनके उपयोग के दौरान अंतर के बारे में थोड़ा उलझन में हूं। तो अगर मैंने केवल सिंक() का उपयोग करके अपने मॉडल अपडेट किए हैं तो क्या यह मेरे डेटाबेस को सही तरीके से माइग्रेट करेगा? – loics2

+2

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

+0

नीचे मतदान क्योंकि प्रश्न विशेष रूप से माइग्रेशन (जिसे आपको उत्पादन के लिए जरूरी है) के बारे में है और यह उत्तर इसका उत्तर नहीं देता है। (लेकिन 'सिंक' के लिए अच्छा जवाब)। – AJP

2

खोज के बहुत सारे के बाद, मैं समझा कि मैं क्या करना चाहता था ब्लॉग पोस्ट की एक जोड़ी मिल गया।

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

यहां पोस्ट हैं: the first one, this one से प्रेरित।

लेकिन वैसे भी, मुझे लगता है कि ezrepotein सिंक के साथ प्रारंभिक डेटाबेस बनाने के बारे में सही है, और फिर माइग्रेट करें। यह उमज़ग का उपयोग करने से आसान लगता है और केवल माइग्रेशन का उपयोग करता है।

user_id: { 
    type: Sequelize.BIGINT, 
    references: { 
     model: "users", 
     key: "id" 
    } 
}, 

बस सुनिश्चित करें कि मॉडल आप संदर्भित कर रहे मौजूद है:

+0

मैं अंतिम वाक्य तक सब कुछ के साथ सहमत हूं। आपको उत्पादन कोड के लिए माइग्रेशन की आवश्यकता है। – AJP

+0

क्या आप उत्पादन पर डेटाबेस शुरू करने के लिए माइग्रेशन का उपयोग करने के लिए संभावित उपयोग केस पर विस्तृत जानकारी दे सकते हैं? – ezpn

+1

@ezrepotein सिंक डीबी निर्माण के लिए ठीक है जाहिर है केवल प्रश्न शीर्षक अधिक सामान्य (और इसलिए उपयोगी) में अनुवाद किया जाता है "Sequelize माइग्रेशन में संघ"। मैं वास्तव में उत्पादन पर माइग्रेशन का उपयोग करना पसंद करता हूं, हालांकि यदि आप इसे अपने परीक्षण डीबी के लिए भी नहीं करते हैं। फिर आपका डीबी सेटअप और अपडेट कुछ घोषणात्मक कमांड का उपयोग करता है जैसे 'sequelize डीबी: माइग्रेट', कुछ 'अगर कोई डीबी नहीं है, तो डीबी: सिंक, अन्यथा डीबी: माइग्रेट' थोडा चीज़। मुझे लगता है कि बाद में पूर्व में आम तौर पर स्वीकृत मामूली वरीयता है। – AJP

0

आप माइग्रेशन

उदाहरण के लिए संदर्भ जोड़ सकते हैं।

0

उपरोक्त @ aryeh-armon उत्तर के लिए टिप्पणी (पर्याप्त प्रतिनिधि नहीं) के बजाय इसे उत्तर के रूप में जोड़ना। यह तालिका का नाम है जिसे आपको मॉडल नाम के बजाय सुनिश्चित करने की आवश्यकता है। यानी यदि आपके मॉडल का नाम नौकरी है और आपकी डीबी टेबल को जॉब्स नाम दिया गया है तो माइग्रेशन इसके बजाए ऐसा दिखाई देगा।

jobId: { 
type: Sequelize.INTEGER, 
references: { 
    model: "Jobs", 
    key: "id" 
    } 
}, 
+0

यह आर्यहे अम्मोन के उत्तर पर एक स्पष्टीकरण है (जो, मैं सहमत हूं, एक टिप्पणी होनी चाहिए) लेकिन मेरे पास अभी तक अन्य उपयोगकर्ता के उत्तरों पर टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं है। – adamS