Migreringer
Jeg vil foreslå, at du bruger sequelize migrationer
i stedet for sync()
på hver model. Der er et modul - sequelize.cli
der giver dig mulighed for nemt at administrere migrationer og frø. Det fremtvinger på en eller anden måde en projektstruktur ved at skabe initialiseringsfilen index.js
inde i /models
bibliotek over projektet. Det antages, at alle dine modeldefinitioner vil være i denne mappe. Dette script gentager alle modelfilerne (hver modeldefinition er i en separat fil, f.eks. mentee.js
, question.js
) og udfører sequelize.import()
for at tildele disse modeller til sequelize-forekomsten - dette giver dig adgang til dem senere via sequelize[modelName]
for eksempel. sequelize.question
.
Bemærk: Når du opretter migreringsfiler, husk om tidsstemplingsfelter - createdAt
, updatedAt
og til sidst deletedAt
.
Synkroniser
Personligt bruger jeg sync()
kun når jeg kører testene - dette kan vises i tre trin
- udfør
sequelize.sync({ force: true })
for at synkronisere alle modeller - kør nogle database-
seeds
(kan også gøres viasequelize-cli
), - kør test.
Dette er meget behageligt, fordi det giver dig mulighed for at rense databasen, før du kører test, og for at skelne udvikling fra test, kan test bruge forskellige databaser, f.eks. project_test
, så udviklingsdatabasen forbliver intakt.
Mange-til-mange
Lad os nu gå videre til dit problem - m:n forhold mellem to modeller. Først og fremmest på grund af det faktum, at du udfører Promise.all()
, sync
kan køre i en anden rækkefølge, end du tilføjer funktionerne i den. For at undgå denne situation foreslår jeg, at du bruger mapSeries
funktion af Bluebird
løfte, som Sequelize bruger og afslører under sequelize.Promise
(dette er også årsagen til din sidste fejl om sletning af overordnet række - du forsøger at slette mentees
som er refereret fra menteequestion
).
sequelize.Promise.mapSeries([
Mentee.sync({ force: true })
, Question.sync({ force: true })
, MenteeQuestion.sync({ force: true })
], (model) => { return model.destroy({ where: {} }); }).then(() => {
});
Første parameter i mapSeries
er en række løfter, men den anden er en funktion, som køres med resultatet af hvert tidligere defineret løfte. På grund af det faktum, at Model.sync()
resulterer i selve modellen, kan vi udføre model.destroy()
ved hver iteration.
Derefter kan du indsætte nogle data til databasen via create()
, ligesom i eksemplet. Nu er det tid til at rette Fejlen:mentee er ikke knyttet til mentee-spørgsmål! fejl. Det opstår, fordi du har tilknyttet Mentee
med Question
men der er ingen sammenhæng mellem MenteeQuestion
og Mentee
(eller Question
). For at rette op på det, efter belongsToMany
, kan du tilføje
MenteeQuestion.belongsTo(Mentee, { foreignKey: 'menteeId' });
MenteeQuestion.belongsTo(Question, { foreignKey: 'questionId' });
Nu er du i stand til at tilføje include: [Mentee, Question]
når du forespørger MenteeQuestion
. Du vil også køre på en anden fejl, mens du laver toJSON()
, fordi du gør findAll
som returnerer række af forekomster. Du kunne gøre forEach()
menteeQuestions.forEach(menteeQuestion => {
console.log(menteeQuestion.toJSON());
});