Migrace
Navrhoval bych, abyste použili sequelize migrace
místo toho proveďte sync() na každém modelu. Existuje modul - sequelize.cli
což vám umožňuje snadno spravovat migrace a semena. Nějakým způsobem vynucuje strukturu projektu vytvořením inicializačního souboru index.js uvnitř /models adresář projektu. Předpokládá, že všechny vaše definice modelu budou v tomto adresáři. Tento skript prochází všemi soubory modelu (každá definice modelu je v samostatném souboru, např. mentee.js , question.js ) a provede sequelize.import() za účelem přiřazení těchto modelů k instanci sequelize – to vám umožní přistupovat k nim později prostřednictvím sequelize[modelName] např. sequelize.question .
Poznámka: při vytváření migračních souborů pamatujte na pole časových razítek - createdAt , updatedAt a případně deletedAt .
Synchronizovat
Osobně používám sync() pouze když spustím testy – to se může zobrazit ve třech krocích
- proveďte
sequelize.sync({ force: true })za účelem synchronizace všech modelů - spusťte nějakou databázi
seeds(lze také provést pomocísequelize-cli), - spustit testy.
To je velmi pohodlné, protože vám umožňuje vyčistit databázi před spuštěním testů a pro odlišení vývoje od testů mohou testy používat různé databáze, např. project_test , takže vývojová databáze zůstane nedotčena.
Mnoho-mnoho
Nyní přejděme k vašemu problému - vztah m:n mezi dvěma modely. Za prvé kvůli skutečnosti, že provádíte Promise.all() , sync může běžet v jiném pořadí, než do kterého přidáváte funkce. Abyste se této situaci vyhnuli, doporučuji vám použít mapSeries funkce Bluebird slib, který Sequelize používá a vystavuje pod sequelize.Promise (to je také důvod vaší poslední chyby při mazání nadřazeného řádku – pokoušíte se smazat mentees na který se odkazuje z menteequestion ).
sequelize.Promise.mapSeries([
Mentee.sync({ force: true })
, Question.sync({ force: true })
, MenteeQuestion.sync({ force: true })
], (model) => { return model.destroy({ where: {} }); }).then(() => {
});
První parametr mapSeries je pole příslibů, ale druhá je funkce, která se spouští s výsledkem každého dříve definovaného příslibu. Vzhledem k tomu, že Model.sync() výsledky v modelu samotném, můžeme provést model.destroy() při každé iteraci.
Poté můžete vložit některá data do databáze pomocí create() , stejně jako v příkladu. Nyní je čas opravit Chybu:mentee není spojen s menteequestion! chyba. Dochází k tomu, protože jste přidružili Mentee s Question ale neexistuje žádná asociace mezi MenteeQuestion a Mentee (nebo Question ). Chcete-li to opravit, po belongsToMany , můžete přidat
MenteeQuestion.belongsTo(Mentee, { foreignKey: 'menteeId' });
MenteeQuestion.belongsTo(Question, { foreignKey: 'questionId' });
Nyní můžete přidat include: [Mentee, Question] při dotazu MenteeQuestion . Při provádění toJSON() byste také spustili jinou chybu , protože děláte findAll který vrací pole instancí. Můžete udělat forEach()
menteeQuestions.forEach(menteeQuestion => {
console.log(menteeQuestion.toJSON());
});