Migracje
Proponuję użyć sequelize migracje
zamiast tego robi sync() na każdym modelu. Istnieje moduł - sequelize.cli
co pozwala łatwo zarządzać migracjami i seedami. W pewien sposób wymusza to strukturę projektu, tworząc plik inicjujący index.js wewnątrz /models katalog projektu. Zakłada, że wszystkie definicje modeli będą znajdować się w tym katalogu. Ten skrypt iteruje przez wszystkie pliki modeli (każda definicja modelu znajduje się w osobnym pliku, np. mentee.js , question.js ) i wykonuje sequelize.import() w celu przypisania tych modeli do instancji sequelize - to pozwala na późniejszy dostęp do nich poprzez sequelize[modelName] np. sequelize.question .
Uwaga: podczas tworzenia plików migracji pamiętaj o polach znaczników czasu - createdAt , updatedAt i ostatecznie deletedAt .
Synchronizacja
Osobiście używam sync() tylko wtedy, gdy uruchamiam testy - można to pokazać w trzech krokach
- wykonaj
sequelize.sync({ force: true })w celu synchronizacji wszystkich modeli - uruchom trochę bazy danych
seeds(można również zrobić przezsequelize-cli), - przeprowadź testy.
Jest to bardzo wygodne, ponieważ pozwala wyczyścić bazę danych przed uruchomieniem testów, a w celu odróżnienia programowania od testów, testy mogą korzystać z innej bazy danych, m.in. project_test , dzięki czemu baza danych rozwoju pozostaje nienaruszona.
Wiele do wielu
Przejdźmy teraz do Twojego problemu - relacji m:n między dwoma modelami. Przede wszystkim ze względu na to, że wykonujesz Promise.all() , sync może działać w innej kolejności niż dodajesz w nim funkcje. Aby uniknąć tej sytuacji, sugeruję użycie mapSeries funkcja Bluebird obietnica, której Sequelize używa i ujawnia w sequelize.Promise (jest to również powód twojego ostatniego błędu dotyczącego usuwania wiersza nadrzędnego - próbujesz usunąć mentees do którego odwołuje się menteequestion ).
sequelize.Promise.mapSeries([
Mentee.sync({ force: true })
, Question.sync({ force: true })
, MenteeQuestion.sync({ force: true })
], (model) => { return model.destroy({ where: {} }); }).then(() => {
});
Pierwszy parametr mapSeries to tablica obietnic, natomiast druga to funkcja uruchamiana z wynikiem każdej wcześniej zdefiniowanej obietnicy. Ze względu na fakt, że Model.sync() wyniki w samym modelu, możemy wykonać model.destroy() w każdej iteracji.
Następnie możesz wstawić niektóre dane do bazy danych za pomocą create() , tak jak w przykładzie. Czas naprawić Błąd:podopieczny nie jest powiązany z podopiecznym! błąd. Dzieje się tak, ponieważ powiązałeś Mentee z Question ale nie ma powiązania między MenteeQuestion i Mentee (lub Question ). Aby to naprawić, po belongsToMany , możesz dodać
MenteeQuestion.belongsTo(Mentee, { foreignKey: 'menteeId' });
MenteeQuestion.belongsTo(Question, { foreignKey: 'questionId' });
Teraz możesz dodać include: [Mentee, Question] podczas zapytania MenteeQuestion . Uruchomiłbyś również inny błąd podczas wykonywania toJSON() , ponieważ robisz findAll co zwraca tablicę instancji. Możesz zrobić forEach()
menteeQuestions.forEach(menteeQuestion => {
console.log(menteeQuestion.toJSON());
});