Migraties
Ik raad je aan om sequelize migraties
te gebruiken doe in plaats daarvan sync()
op elk model. Er is een module - sequelize.cli
waarmee u migraties en zaden gemakkelijk kunt beheren. Het dwingt op de een of andere manier een projectstructuur af door het initialisatiebestand index.js
te maken binnen /models
map van het project. Het gaat ervan uit dat al uw modeldefinities in deze map staan. Dit script doorloopt alle modelbestanden (elke modeldefinitie bevindt zich in een afzonderlijk bestand, bijvoorbeeld mentee.js
, question.js
) en voert sequelize.import()
. uit om die modellen toe te wijzen aan de sequelize-instantie - hierdoor kunt u ze later openen via sequelize[modelName]
bijv. sequelize.question
.
Opmerking: onthoud bij het maken van migratiebestanden de velden met tijdstempels - createdAt
, updatedAt
en, uiteindelijk, deletedAt
.
Synchroniseren
Persoonlijk gebruik ik sync()
alleen als ik de tests uitvoer - dit kan in drie stappen worden weergegeven
- voer
sequelize.sync({ force: true })
om alle modellen te synchroniseren - voer een aantal database
seeds
uit (kan ook viasequelize-cli
), - voer tests uit.
Dit is zeer comfortabel omdat u de database kunt opschonen voordat u tests uitvoert, en om ontwikkeling van tests te onderscheiden, kunnen tests verschillende databases gebruiken, b.v. project_test
, zodat de ontwikkelingsdatabase intact blijft.
Veel-op-veel
Laten we nu verder gaan met uw probleem - m:n relatie tussen twee modellen. Allereerst vanwege het feit dat u Promise.all()
. uitvoert , de sync
kan in een andere volgorde worden uitgevoerd dan dat u de functies erin toevoegt. Om deze situatie te voorkomen, raad ik u aan mapSeries
. te gebruiken kenmerk van Bluebird
belofte, die Sequelize gebruikt en openbaart onder sequelize.Promise
(dit is ook de reden van je laatste fout over het verwijderen van de bovenliggende rij - je probeert mentees
te verwijderen waarnaar wordt verwezen vanuit menteequestion
).
sequelize.Promise.mapSeries([
Mentee.sync({ force: true })
, Question.sync({ force: true })
, MenteeQuestion.sync({ force: true })
], (model) => { return model.destroy({ where: {} }); }).then(() => {
});
Eerste parameter van mapSeries
is een reeks beloften, maar de tweede is een functie die wordt uitgevoerd met het resultaat van elke eerder gedefinieerde belofte. Vanwege het feit dat Model.sync()
resultaten in het Model zelf, kunnen we model.destroy()
. uitvoeren bij elke iteratie.
Daarna kun je wat gegevens in de database invoegen via create()
, net als in het voorbeeld. Nu is het tijd om de Fout op te lossen:mentee is niet gekoppeld aan menteequestion! fout. Het komt voor omdat je Mentee
. hebt gekoppeld met Question
maar er is geen verband tussen MenteeQuestion
en Mentee
(of Question
). Om dat op te lossen, nadat belongsToMany
, je kunt toevoegen
MenteeQuestion.belongsTo(Mentee, { foreignKey: 'menteeId' });
MenteeQuestion.belongsTo(Question, { foreignKey: 'questionId' });
Nu kun je include: [Mentee, Question]
. toevoegen bij het opvragen van MenteeQuestion
. Je zou ook op een andere fout lopen terwijl je toJSON()
. doet , omdat je findAll
. doet die een reeks instanties retourneert. Je zou forEach()
. kunnen doen
menteeQuestions.forEach(menteeQuestion => {
console.log(menteeQuestion.toJSON());
});