Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

Sequelize का उपयोग करके कई-से-अनेक संबंधों का सरल उदाहरण

माइग्रेशन

मेरा सुझाव है कि आप अनुक्रम माइग्रेशन का उपयोग करें। इसके बजाय sync() कर रहे हैं प्रत्येक मॉडल पर। एक मॉड्यूल है - sequelize.cli जो आपको माइग्रेशन और बीजों को आसानी से प्रबंधित करने की अनुमति देता है। यह, किसी तरह, आरंभीकरण फ़ाइल index.js . बनाकर प्रोजेक्ट संरचना को बाध्य करता है अंदर /models परियोजना की निर्देशिका। यह मानता है कि आपकी सभी मॉडल परिभाषाएँ इस निर्देशिका में होंगी। यह स्क्रिप्ट सभी मॉडल फ़ाइलों के माध्यम से पुनरावृत्त होती है (प्रत्येक मॉडल परिभाषा अलग फ़ाइल में है जैसे mentee.js , question.js ) और sequelize.import() . करता है उन मॉडलों को अनुक्रमिक उदाहरण के लिए असाइन करने के लिए - यह आपको बाद में sequelize[modelName] के माध्यम से उन तक पहुंचने देता है जैसे sequelize.question .

नोट: माइग्रेशन फ़ाइलें बनाते समय टाइमस्टैम्प फ़ील्ड के बारे में याद रखें - createdAt , updatedAt और, अंततः, deletedAt

सिंक

व्यक्तिगत रूप से मैं sync() . का उपयोग करता हूं केवल जब मैं परीक्षण चलाता हूं - इसे तीन चरणों में दिखाया जा सकता है

  1. प्रदर्शन sequelize.sync({ force: true }) सभी मॉडलों को सिंक्रनाइज़ करने के लिए
  2. कुछ डेटाबेस चलाएँ seeds (sequelize-cli . के माध्यम से भी किया जा सकता है ),
  3. परीक्षण चलाएं।

यह बहुत सुविधाजनक है क्योंकि परीक्षण चलाने से पहले आपको डेटाबेस को साफ करने की अनुमति मिलती है, और परीक्षणों से विकास को अलग करने के लिए, परीक्षण विभिन्न डेटाबेस का उपयोग कर सकते हैं उदा। 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());
});



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक ब्लॉब का उपयोग करके एक MySQL डेटाबेस में एक छवि अपलोड करना

  2. डेटाबेस डिज़ाइन:समग्र कुंजी बनाम एक स्तंभ प्राथमिक कुंजी

  3. मेरी टेबल का आकार अपेक्षा से 4x बड़ा क्यों है? (पंक्तियाँ * बाइट्स / पंक्ति)

  4. mysqld की अनुचित हत्या - अब शुरू नहीं हो रही है

  5. MySQL को AAO मानता है?