sql >> Database >  >> RDS >> Mysql

Eenvoudig voorbeeld van veel-op-veel-relaties met Sequelize

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

  1. voer sequelize.sync({ force: true }) om alle modellen te synchroniseren
  2. voer een aantal database seeds uit (kan ook via sequelize-cli ),
  3. 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());
});



  1. Wat is de SQL-verbindingsreeks die ik moet gebruiken om toegang te krijgen tot localhost\SQLEXPRESS met Windows-verificatie of SQL-verificatie?

  2. Hoe een PostgreSQL-database verwijderen als er actieve verbindingen mee zijn?

  3. hoe een komma te vinden met mysql find_in_set

  4. Wat is het verschil tussen LATERAL JOIN en een subquery in PostgreSQL?