माइग्रेशन
मेरा सुझाव है कि आप अनुक्रम माइग्रेशन
का उपयोग करें। इसके बजाय sync()
कर रहे हैं प्रत्येक मॉडल पर। एक मॉड्यूल है - sequelize.cli
जो आपको माइग्रेशन और बीजों को आसानी से प्रबंधित करने की अनुमति देता है। यह, किसी तरह, आरंभीकरण फ़ाइल index.js
. बनाकर प्रोजेक्ट संरचना को बाध्य करता है अंदर /models
परियोजना की निर्देशिका। यह मानता है कि आपकी सभी मॉडल परिभाषाएँ इस निर्देशिका में होंगी। यह स्क्रिप्ट सभी मॉडल फ़ाइलों के माध्यम से पुनरावृत्त होती है (प्रत्येक मॉडल परिभाषा अलग फ़ाइल में है जैसे mentee.js
, question.js
) और sequelize.import()
. करता है उन मॉडलों को अनुक्रमिक उदाहरण के लिए असाइन करने के लिए - यह आपको बाद में sequelize[modelName]
के माध्यम से उन तक पहुंचने देता है जैसे sequelize.question
.
नोट: माइग्रेशन फ़ाइलें बनाते समय टाइमस्टैम्प फ़ील्ड के बारे में याद रखें - createdAt
, updatedAt
और, अंततः, deletedAt
।
सिंक
व्यक्तिगत रूप से मैं sync()
. का उपयोग करता हूं केवल जब मैं परीक्षण चलाता हूं - इसे तीन चरणों में दिखाया जा सकता है
- प्रदर्शन
sequelize.sync({ force: true })
सभी मॉडलों को सिंक्रनाइज़ करने के लिए - कुछ डेटाबेस चलाएँ
seeds
(sequelize-cli
. के माध्यम से भी किया जा सकता है ), - परीक्षण चलाएं।
यह बहुत सुविधाजनक है क्योंकि परीक्षण चलाने से पहले आपको डेटाबेस को साफ करने की अनुमति मिलती है, और परीक्षणों से विकास को अलग करने के लिए, परीक्षण विभिन्न डेटाबेस का उपयोग कर सकते हैं उदा। project_test
, ताकि विकास डेटाबेस बरकरार रहे।
कई-से-अनेक
अब आपकी समस्या पर चलते हैं - m:n दो मॉडलों के बीच संबंध। सबसे पहले, इस तथ्य के कारण कि आप Promise.all()
perform करते हैं , sync
आप इसमें फ़ंक्शन जोड़ने की तुलना में भिन्न क्रम में चल सकते हैं। इस स्थिति से बचने के लिए मेरा सुझाव है कि आप mapSeries
. का उपयोग करें Bluebird
की विशेषता वादा, जिसे Sequelize sequelize.Promise
. के तहत उपयोग करता है और उजागर करता है (पैरेंट रो को डिलीट करने के बारे में आपकी आखिरी त्रुटि का भी यही कारण है - आप mentees
को डिलीट करने का प्रयास करें जिसे menteequestion
. से संदर्भित किया गया है )।
sequelize.Promise.mapSeries([
Mentee.sync({ force: true })
, Question.sync({ force: true })
, MenteeQuestion.sync({ force: true })
], (model) => { return model.destroy({ where: {} }); }).then(() => {
});
mapSeries
. का पहला पैरामीटर वादों की सरणी है, हालांकि दूसरा एक फ़ंक्शन है जो प्रत्येक पहले से परिभाषित वादे के परिणाम के साथ चलाया जाता है। इस तथ्य के कारण कि Model.sync()
मॉडल में ही परिणाम, हम प्रदर्शन कर सकते हैं model.destroy()
प्रत्येक पुनरावृत्ति पर।
उसके बाद आप create()
. के माध्यम से डेटाबेस में कुछ डेटा डाल सकते हैं , जैसा कि उदाहरण में है। अब समय आ गया है कि त्रुटि को ठीक किया जाए:mentee menteequestion से संबद्ध नहीं है! गलती। ऐसा इसलिए होता है क्योंकि आपने Mentee
. को संबद्ध किया है Question
. के साथ लेकिन MenteeQuestion
. के बीच कोई संबंध नहीं है और Mentee
(या Question
) इसे ठीक करने के लिए, belongsToMany
, आप जोड़ सकते हैं
MenteeQuestion.belongsTo(Mentee, { foreignKey: 'menteeId' });
MenteeQuestion.belongsTo(Question, { foreignKey: 'questionId' });
अब आप include: [Mentee, Question]
क्वेरी करते समय MenteeQuestion
. toJSON()
. करते समय आप एक और त्रुटि पर भी चलेंगे , क्योंकि आप findAll
. करते हैं जो उदाहरणों की सरणी देता है। आप forEach()
कर सकते हैं
menteeQuestions.forEach(menteeQuestion => {
console.log(menteeQuestion.toJSON());
});